diff --git a/pkg/apis/providerconfig/v1/types.go b/pkg/apis/providerconfig/v1/types.go index f4bbd9b902..7ef1712b45 100644 --- a/pkg/apis/providerconfig/v1/types.go +++ b/pkg/apis/providerconfig/v1/types.go @@ -32,27 +32,62 @@ type ProviderConfig struct { Status ProviderConfigStatus `json:"status,omitempty"` } -// ProviderConfigSpec is the spec for a resource +// ProviderConfigSpec defines the desired state of ProviderConfig. // +k8s:openapi-gen=true type ProviderConfigSpec struct { - // The ID of the project where the provider config is to be created. - ProjectID string `json:"projectID,omitempty"` - // The project number where the provider config is to be created. - ProjectNumber int64 `json:"projectNumber,omitempty"` - // The network configuration for the provider config. - NetworkConfig *NetworkConfig `json:"networkConfig,omitempty"` + // ProjectNumber is the GCP project number. + // + // +kubebuilder:validation:Minimum=0 + // +(Validation done in accordance with go/elysium/project_ids#project-number) + ProjectNumber int64 `json:"projectNumber"` + // ProjectID is the GCP Project ID. + // + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=30 + // +(Validation done in accordance with https://cloud.google.com/resource-manager/docs/creating-managing-projects#before_you_begin) + ProjectID string `json:"projectID"` + // PSC connection ID of the PSC endpoint. + // + // +kubebuilder:validation:Minimum=0 + // +kubebuilder:validation:Optional + PSCConnectionID int64 `json:"pscConnectionID"` + NetworkConfig ProviderNetworkConfig `json:"networkConfig"` } -// NetworkConfig specifies the network configuration for the provider config. -type NetworkConfig struct { +// ProviderNetworkConfig specifies the network configuration for the provider config. +type ProviderNetworkConfig struct { // The network where the provider config is to be created. Network string `json:"network,omitempty"` // The default subnetwork where the provider config is to be created. - DefaultSubnetwork string `json:"defaultSubnetwork,omitempty"` + SubnetInfo ProviderConfigSubnetInfo `json:"subnetInfo"` } -// ProviderConfigStatus is the status for a ProviderConfig resource +// ProviderConfigSubnetInfo defines the subnet configuration. +type ProviderConfigSubnetInfo struct { + // Subnetwork is the name of the subnetwork in the format projects/{project}/regions/{region}/subnetworks/{subnet}. + Subnetwork string `json:"subnetwork"` + // The primary IP range of the subnet in CIDR notation (e.g.,`10.0.0.0/16`). + CIDR string `json:"cidr"` + // PodRanges contains the Pod CIDR ranges that are part of this Subnet. + PodRanges []ProviderConfigSecondaryRange `json:"podRanges"` +} + +// ProviderConfigSecondaryRange describes the configuration of a SecondaryRange. +type ProviderConfigSecondaryRange struct { + // The name of the secondary range. + Name string `json:"name"` + // The secondary IP range in CIDR notation (e.g.,`10.0.0.0/16`). + CIDR string `json:"cidr"` +} + +// ProviderConfigStatus defines the current state of ProviderConfig. type ProviderConfigStatus struct { + // Conditions describe the current conditions of the ProviderConfig. + // + // +listType=map + // +listMapKey=type + // +optional + Conditions []metav1.Condition `json:"conditions,omitempty"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/pkg/apis/providerconfig/v1/zz_generated.deepcopy.go b/pkg/apis/providerconfig/v1/zz_generated.deepcopy.go index 05ea292b46..d45732cb0e 100644 --- a/pkg/apis/providerconfig/v1/zz_generated.deepcopy.go +++ b/pkg/apis/providerconfig/v1/zz_generated.deepcopy.go @@ -22,32 +22,17 @@ limitations under the License. package v1 import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NetworkConfig) DeepCopyInto(out *NetworkConfig) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkConfig. -func (in *NetworkConfig) DeepCopy() *NetworkConfig { - if in == nil { - return nil - } - out := new(NetworkConfig) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ProviderConfig) DeepCopyInto(out *ProviderConfig) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status + in.Status.DeepCopyInto(&out.Status) return } @@ -103,13 +88,25 @@ func (in *ProviderConfigList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ProviderConfigSpec) DeepCopyInto(out *ProviderConfigSpec) { +func (in *ProviderConfigSecondaryRange) DeepCopyInto(out *ProviderConfigSecondaryRange) { *out = *in - if in.NetworkConfig != nil { - in, out := &in.NetworkConfig, &out.NetworkConfig - *out = new(NetworkConfig) - **out = **in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProviderConfigSecondaryRange. +func (in *ProviderConfigSecondaryRange) DeepCopy() *ProviderConfigSecondaryRange { + if in == nil { + return nil } + out := new(ProviderConfigSecondaryRange) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProviderConfigSpec) DeepCopyInto(out *ProviderConfigSpec) { + *out = *in + in.NetworkConfig.DeepCopyInto(&out.NetworkConfig) return } @@ -126,6 +123,13 @@ func (in *ProviderConfigSpec) DeepCopy() *ProviderConfigSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ProviderConfigStatus) DeepCopyInto(out *ProviderConfigStatus) { *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]metav1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } @@ -138,3 +142,41 @@ func (in *ProviderConfigStatus) DeepCopy() *ProviderConfigStatus { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProviderConfigSubnetInfo) DeepCopyInto(out *ProviderConfigSubnetInfo) { + *out = *in + if in.PodRanges != nil { + in, out := &in.PodRanges, &out.PodRanges + *out = make([]ProviderConfigSecondaryRange, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProviderConfigSubnetInfo. +func (in *ProviderConfigSubnetInfo) DeepCopy() *ProviderConfigSubnetInfo { + if in == nil { + return nil + } + out := new(ProviderConfigSubnetInfo) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProviderNetworkConfig) DeepCopyInto(out *ProviderNetworkConfig) { + *out = *in + in.SubnetInfo.DeepCopyInto(&out.SubnetInfo) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProviderNetworkConfig. +func (in *ProviderNetworkConfig) DeepCopy() *ProviderNetworkConfig { + if in == nil { + return nil + } + out := new(ProviderNetworkConfig) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/apis/providerconfig/v1/zz_generated.openapi.go b/pkg/apis/providerconfig/v1/zz_generated.openapi.go index 084c2db085..b1fea88757 100644 --- a/pkg/apis/providerconfig/v1/zz_generated.openapi.go +++ b/pkg/apis/providerconfig/v1/zz_generated.openapi.go @@ -86,33 +86,44 @@ func schema_pkg_apis_providerconfig_v1_ProviderConfigSpec(ref common.ReferenceCa return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "ProviderConfigSpec is the spec for a resource", + Description: "ProviderConfigSpec defines the desired state of ProviderConfig.", Type: []string{"object"}, Properties: map[string]spec.Schema{ + "projectNumber": { + SchemaProps: spec.SchemaProps{ + Description: "ProjectNumber is the GCP project number.", + Default: 0, + Type: []string{"integer"}, + Format: "int64", + }, + }, "projectID": { SchemaProps: spec.SchemaProps{ - Description: "The ID of the project where the provider config is to be created.", + Description: "ProjectID is the GCP Project ID.", + Default: "", Type: []string{"string"}, Format: "", }, }, - "projectNumber": { + "pscConnectionID": { SchemaProps: spec.SchemaProps{ - Description: "The project number where the provider config is to be created.", + Description: "PSC connection ID of the PSC endpoint.", + Default: 0, Type: []string{"integer"}, Format: "int64", }, }, "networkConfig": { SchemaProps: spec.SchemaProps{ - Description: "The network configuration for the provider config.", - Ref: ref("k8s.io/ingress-gce/pkg/apis/providerconfig/v1.NetworkConfig"), + Default: map[string]interface{}{}, + Ref: ref("k8s.io/ingress-gce/pkg/apis/providerconfig/v1.ProviderNetworkConfig"), }, }, }, + Required: []string{"projectNumber", "projectID", "pscConnectionID", "networkConfig"}, }, }, Dependencies: []string{ - "k8s.io/ingress-gce/pkg/apis/providerconfig/v1.NetworkConfig"}, + "k8s.io/ingress-gce/pkg/apis/providerconfig/v1.ProviderNetworkConfig"}, } } diff --git a/pkg/multiproject/gce/fake.go b/pkg/multiproject/gce/fake.go index b781a5300e..f32c5be0a5 100644 --- a/pkg/multiproject/gce/fake.go +++ b/pkg/multiproject/gce/fake.go @@ -40,14 +40,14 @@ func (g *GCEFake) GCEForProviderConfig(providerConfig *v1.ProviderConfig, logger updatedConfig := g.defaultTestClusterValues updatedConfig.ProjectID = providerConfig.Spec.ProjectID updatedConfig.NetworkURL = fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/%s/global/networks/%s", providerConfig.Spec.ProjectID, providerConfig.Spec.NetworkConfig.Network) - updatedConfig.SubnetworkURL = fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/%s/regions/%s/subnetworks/%s", providerConfig.Spec.ProjectID, updatedConfig.Region, providerConfig.Spec.NetworkConfig.DefaultSubnetwork) + updatedConfig.SubnetworkURL = fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/%s/regions/%s/subnetworks/%s", providerConfig.Spec.ProjectID, updatedConfig.Region, providerConfig.Spec.NetworkConfig.SubnetInfo.Subnetwork) logger.Info("Creating GCEFake for provider config", "providerConfig", providerConfig.Name, "updatedConfig", updatedConfig) fakeCloud := cloudgce.NewFakeGCECloud(updatedConfig) _, err := createNetwork(fakeCloud, providerConfig.Spec.NetworkConfig.Network) if err != nil { return nil, err } - _, err = createSubnetwork(fakeCloud, providerConfig.Spec.NetworkConfig.DefaultSubnetwork, providerConfig.Spec.NetworkConfig.Network) + _, err = createSubnetwork(fakeCloud, providerConfig.Spec.NetworkConfig.SubnetInfo.Subnetwork, providerConfig.Spec.NetworkConfig.Network) if err != nil { return nil, err } diff --git a/pkg/multiproject/gce/fake_test.go b/pkg/multiproject/gce/fake_test.go index fd5a8944dd..2addb9c5c4 100644 --- a/pkg/multiproject/gce/fake_test.go +++ b/pkg/multiproject/gce/fake_test.go @@ -17,9 +17,11 @@ func TestNewGCEForProviderConfig(t *testing.T) { }, Spec: v1.ProviderConfigSpec{ ProjectID: "custom-project-id", - NetworkConfig: &v1.NetworkConfig{ - Network: "custom-network", - DefaultSubnetwork: "custom-subnetwork", + NetworkConfig: v1.ProviderNetworkConfig{ + Network: "custom-network", + SubnetInfo: v1.ProviderConfigSubnetInfo{ + Subnetwork: "custom-subnetwork", + }, }, }, } diff --git a/pkg/multiproject/gce/gce.go b/pkg/multiproject/gce/gce.go index ccfa68cbc0..37928d31af 100644 --- a/pkg/multiproject/gce/gce.go +++ b/pkg/multiproject/gce/gce.go @@ -93,13 +93,11 @@ func generateConfigForProviderConfig(defaultConfigContent string, providerConfig globalSection.Key(tokenBodyKey).SetValue(newTokenBody) // Update NetworkName and SubnetworkName - if providerConfig.Spec.NetworkConfig != nil { - networkNameKey := "network-name" - globalSection.Key(networkNameKey).SetValue(providerConfig.Spec.NetworkConfig.Network) + networkNameKey := "network-name" + globalSection.Key(networkNameKey).SetValue(providerConfig.Spec.NetworkConfig.Network) - subnetworkNameKey := "subnetwork-name" - globalSection.Key(subnetworkNameKey).SetValue(providerConfig.Spec.NetworkConfig.DefaultSubnetwork) - } + subnetworkNameKey := "subnetwork-name" + globalSection.Key(subnetworkNameKey).SetValue(providerConfig.Spec.NetworkConfig.SubnetInfo.Subnetwork) // Write the modified config content to a string with custom options var modifiedConfigContent bytes.Buffer diff --git a/pkg/multiproject/gce/gce_test.go b/pkg/multiproject/gce/gce_test.go index c88aa39e59..9be220c2db 100644 --- a/pkg/multiproject/gce/gce_test.go +++ b/pkg/multiproject/gce/gce_test.go @@ -165,9 +165,11 @@ subnetwork-name = default-subnetwork Spec: v1.ProviderConfigSpec{ ProjectID: "providerconfig-project-id", ProjectNumber: 654321, - NetworkConfig: &v1.NetworkConfig{ - Network: "providerconfig-network-url", - DefaultSubnetwork: "providerconfig-subnetwork-url", + NetworkConfig: v1.ProviderNetworkConfig{ + Network: "providerconfig-network-url", + SubnetInfo: v1.ProviderConfigSubnetInfo{ + Subnetwork: "providerconfig-subnetwork-url", + }, }, }, }, @@ -196,9 +198,11 @@ other-field = other-value Spec: v1.ProviderConfigSpec{ ProjectID: "providerconfig-project-id", ProjectNumber: 654321, - NetworkConfig: &v1.NetworkConfig{ - Network: "providerconfig-network-url", - DefaultSubnetwork: "providerconfig-subnetwork-url", + NetworkConfig: v1.ProviderNetworkConfig{ + Network: "providerconfig-network-url", + SubnetInfo: v1.ProviderConfigSubnetInfo{ + Subnetwork: "providerconfig-subnetwork-url", + }, }, }, }, diff --git a/pkg/multiproject/start/start_test.go b/pkg/multiproject/start/start_test.go index 486443bc96..b56acfada0 100644 --- a/pkg/multiproject/start/start_test.go +++ b/pkg/multiproject/start/start_test.go @@ -75,9 +75,11 @@ func TestStartProviderConfigIntegration(t *testing.T) { Spec: providerconfigv1.ProviderConfigSpec{ ProjectID: "my-project", ProjectNumber: 12345, - NetworkConfig: &providerconfigv1.NetworkConfig{ - Network: "my-network", - DefaultSubnetwork: "my-subnetwork", + NetworkConfig: providerconfigv1.ProviderNetworkConfig{ + Network: "my-network", + SubnetInfo: providerconfigv1.ProviderConfigSubnetInfo{ + Subnetwork: "my-subnetwork", + }, }, }, }, @@ -112,9 +114,11 @@ func TestStartProviderConfigIntegration(t *testing.T) { Spec: providerconfigv1.ProviderConfigSpec{ ProjectID: "project-1", ProjectNumber: 1111, - NetworkConfig: &providerconfigv1.NetworkConfig{ - Network: "my-network-1", - DefaultSubnetwork: "my-subnetwork-1", + NetworkConfig: providerconfigv1.ProviderNetworkConfig{ + Network: "my-network-1", + SubnetInfo: providerconfigv1.ProviderConfigSubnetInfo{ + Subnetwork: "my-subnetwork-1", + }, }, }, }, @@ -126,9 +130,11 @@ func TestStartProviderConfigIntegration(t *testing.T) { Spec: providerconfigv1.ProviderConfigSpec{ ProjectID: "project-2", ProjectNumber: 2222, - NetworkConfig: &providerconfigv1.NetworkConfig{ - Network: "my-network-2", - DefaultSubnetwork: "my-subnetwork-2", + NetworkConfig: providerconfigv1.ProviderNetworkConfig{ + Network: "my-network-2", + SubnetInfo: providerconfigv1.ProviderConfigSubnetInfo{ + Subnetwork: "my-subnetwork-2", + }, }, }, },