diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index ddf95796..6c4668ab 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -75,4 +75,4 @@ jobs: with: version: v1.61 working-directory: ${{ matrix.working-directory }} - args: --timeout=5m \ No newline at end of file + args: --timeout=5m --out-format=colored-line-number \ No newline at end of file diff --git a/charts/site-manager/templates/cluster-role.yaml b/charts/site-manager/templates/cluster-role.yaml index 232f2d98..272da4d1 100644 --- a/charts/site-manager/templates/cluster-role.yaml +++ b/charts/site-manager/templates/cluster-role.yaml @@ -4,10 +4,10 @@ kind: ClusterRole metadata: name: {{ .Values.serviceAccount.name }} rules: - - apiGroups: ["netcracker.com"] + - apiGroups: ["qubership.org"] resources: ["sitemanagers"] verbs: ["get", "list", "watch"] - - apiGroups: ["netcracker.com"] + - apiGroups: ["qubership.org"] resources: ["sitemanagers/status"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["coordination.k8s.io"] diff --git a/charts/site-manager/templates/crd-sitemanager.yaml b/charts/site-manager/templates/crd-sitemanager.yaml index 3ce15b77..fa22af58 100644 --- a/charts/site-manager/templates/crd-sitemanager.yaml +++ b/charts/site-manager/templates/crd-sitemanager.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: - name: sitemanagers.netcracker.com + name: sitemanagers.qubership.org {{- if .Values.tls.generateCerts.enabled }} annotations: {{- if eq .Values.tls.generateCerts.executor "cert-manager" }} @@ -13,7 +13,7 @@ metadata: {{- end }} {{- end }} spec: - group: netcracker.com + group: qubership.org names: kind: SiteManager listKind: SiteManagerList @@ -105,7 +105,7 @@ spec: served: true storage: false deprecated: true - deprecationWarning: "netcracker.com/v2 SiteManager is deprecated; use v3 and see actual version on https://github.com/Netcracker/DRNavigator#custom-resource-for-stateful" + deprecationWarning: "qubership.org/v2 SiteManager is deprecated; use v3 and see actual version on https://github.com/Netcracker/DRNavigator#custom-resource-for-stateful" subresources: status: {} schema: @@ -187,7 +187,7 @@ spec: served: false storage: false deprecated: true - deprecationWarning: "netcracker.com/v1 SiteManager is deprecated; use v2 and see actual version on https://github.com/Netcracker/DRNavigator#custom-resource-for-stateful" + deprecationWarning: "qubership.org/v1 SiteManager is deprecated; use v2 and see actual version on https://github.com/Netcracker/DRNavigator#custom-resource-for-stateful" subresources: status: {} schema: @@ -286,55 +286,55 @@ metadata: {{- end }} {{- end }} webhooks: -- name: "site-manager-crd-validating-webhook-v3.netcracker.com" +- name: "site-manager-crd-validating-webhook-v3.qubership.org" admissionReviewVersions: ["v1"] clientConfig: service: namespace: {{ .Release.Namespace }} name: {{ .Chart.Name }} - path: /validate-netcracker-com-v3-sitemanager + path: /validate-qubership-org-v3-sitemanager port: 442 {{- if .Values.tls.ca }} caBundle: "{{ .Values.tls.ca | b64enc }}" {{- end }} rules: - - apiGroups: ["netcracker.com"] + - apiGroups: ["qubership.org"] apiVersions: ["v3"] operations: ["CREATE", "UPDATE"] resources: ["sitemanagers"] scope: "Namespaced" sideEffects: None -- name: "site-manager-crd-validating-webhook-v2.netcracker.com" +- name: "site-manager-crd-validating-webhook-v2.qubership.org" admissionReviewVersions: ["v1"] clientConfig: service: namespace: {{ .Release.Namespace }} name: {{ .Chart.Name }} - path: /validate-netcracker-com-v2-sitemanager + path: /validate-qubership-org-v2-sitemanager port: 442 {{- if .Values.tls.ca }} caBundle: "{{ .Values.tls.ca | b64enc }}" {{- end }} rules: - - apiGroups: ["netcracker.com"] + - apiGroups: ["qubership.org"] apiVersions: ["v2"] operations: ["CREATE", "UPDATE"] resources: ["sitemanagers"] scope: "Namespaced" sideEffects: None -- name: "site-manager-crd-validating-webhook-v1.netcracker.com" +- name: "site-manager-crd-validating-webhook-v1.qubership.org" admissionReviewVersions: ["v1"] clientConfig: service: namespace: {{ .Release.Namespace }} name: {{ .Chart.Name }} - path: /validate-netcracker-com-v1-sitemanager + path: /validate-qubership-org-v1-sitemanager port: 442 {{- if .Values.tls.ca }} caBundle: "{{ .Values.tls.ca | b64enc }}" {{- end }} rules: - - apiGroups: ["netcracker.com"] + - apiGroups: ["qubership.org"] apiVersions: ["v1"] operations: ["CREATE", "UPDATE"] resources: ["sitemanagers"] diff --git a/charts/site-manager/values.yaml b/charts/site-manager/values.yaml index b3b8db08..57d1c339 100644 --- a/charts/site-manager/values.yaml +++ b/charts/site-manager/values.yaml @@ -10,7 +10,8 @@ env: SM_DEBUG: "False" # set CRD parameters - SM_GROUP: "netcracker.com" + SM_GROUP: "qubership.org" + SM_SecGroup: "netcracker.com" SM_KIND: "SiteManager" SM_KIND_LIST: "SiteManagerList" # set HTTP scheme for microservices diff --git a/documentation/internal/design/2-extend-service-names-for-multiple-services.md b/documentation/internal/design/2-extend-service-names-for-multiple-services.md index 173e82bb..302b0606 100644 --- a/documentation/internal/design/2-extend-service-names-for-multiple-services.md +++ b/documentation/internal/design/2-extend-service-names-for-multiple-services.md @@ -75,7 +75,7 @@ Suppose we have two services `serviceA` and `serviceB`, dependent from `serviceA In services helms: ```yaml -apiVersion: netcracker.com/v2 +apiVersion: qubership.org/v2 kind: SiteManager metadata: name: {{ .Values.namespace }}-serviceA @@ -84,7 +84,7 @@ spec: after: [] before: [] --- -apiVersion: netcracker.com/v2 +apiVersion: qubership.org/v2 kind: SiteManager metadata: name: {{ .Values.namespace }}-serviceB @@ -97,7 +97,7 @@ spec: In cluster: ```yaml -apiVersion: netcracker.com/v2 +apiVersion: qubership.org/v2 kind: SiteManager metadata: name: ns1-serviceA @@ -107,7 +107,7 @@ spec: after: [] before: [] --- -apiVersion: netcracker.com/v2 +apiVersion: qubership.org/v2 kind: SiteManager metadata: name: ns2-serviceB @@ -123,7 +123,7 @@ spec: In services helms nothing changes; In cluster: ```yaml -apiVersion: netcracker.com/v3 +apiVersion: qubership.org/v3 kind: SiteManager metadata: name: ns1-serviceA @@ -133,7 +133,7 @@ spec: after: [] before: [] --- -apiVersion: netcracker.com/v3 +apiVersion: qubership.org/v3 kind: SiteManager metadata: name: ns2-serviceB @@ -148,7 +148,7 @@ spec: #### 2. After changing CR names in services helms and redeploy In services helms: ```yaml -apiVersion: netcracker.com/v3 +apiVersion: qubership.org/v3 kind: SiteManager metadata: name: serviceA @@ -157,7 +157,7 @@ spec: after: [] before: [] --- -apiVersion: netcracker.com/v3 +apiVersion: qubership.org/v3 kind: SiteManager metadata: name: serviceB @@ -169,7 +169,7 @@ spec: ``` In cluster: ```yaml -apiVersion: netcracker.com/v3 +apiVersion: qubership.org/v3 kind: SiteManager metadata: name: serviceA @@ -179,7 +179,7 @@ spec: after: [] before: [] --- -apiVersion: netcracker.com/v3 +apiVersion: qubership.org/v3 kind: SiteManager metadata: name: serviceB @@ -268,7 +268,7 @@ on different sites: We can add special optional field to define service name for opponent site, e.g. for `site-1`: ```yaml -apiVersion: netcracker.com/v3 +apiVersion: qubership.org/v3 kind: SiteManager metadata: name: sm-dummy @@ -297,7 +297,7 @@ In sm-client this field can be used to make links between services with differen We can add special optional field to override service name, e.g. for `site-1`: ```yaml -apiVersion: netcracker.com/v3 +apiVersion: qubership.org/v3 kind: SiteManager metadata: name: sm-dummy @@ -335,7 +335,7 @@ spec: We can add special optional field to turn on/off adding namespace to service name (`isUniqueOnCluster`, default is false): ```yaml -apiVersion: netcracker.com/v3 +apiVersion: qubership.org/v3 kind: SiteManager metadata: name: sm-dummy @@ -374,7 +374,7 @@ is `` like now: We can add namespaces only for services with specific volumes (e.g. not stateful). As result, services with another module will have the same name: ```yaml -apiVersion: netcracker.com/v3 +apiVersion: qubership.org/v3 kind: SiteManager metadata: name: sm-dummy diff --git a/documentation/public/architecture.md b/documentation/public/architecture.md index 5d9b13fe..4512ef7a 100644 --- a/documentation/public/architecture.md +++ b/documentation/public/architecture.md @@ -126,7 +126,7 @@ services of the standby Kubernetes cluster. CR SiteManager description: ```yaml -apiVersion: netcracker.com/v3 +apiVersion: qubership.org/v3 kind: SiteManager metadata: name: @@ -170,7 +170,7 @@ for details; Example for `postgres` service: ```yaml -apiVersion: netcracker.com/v3 +apiVersion: qubership.org/v3 kind: SiteManager metadata: annotations: diff --git a/documentation/public/installation.md b/documentation/public/installation.md index 67242a5a..455bdf29 100644 --- a/documentation/public/installation.md +++ b/documentation/public/installation.md @@ -93,7 +93,7 @@ To support the ability of services to be managed by `site-manager`, implement th openssl x509 -req -days 730 -CA ca.crt -CAkey ca.key -CAcreateserial -out site-manager-tls.crt -extensions v3_req -extfile server.conf ``` -3. Create CustomResourceDefinition `sitemanagers.netcracker.com` and ValidatingWebhookConfiguration `site-manager-crd-validating-webhook-configuration` from [file](../../manifests/crd-sitemanager.yaml) as it will be described below. +3. Create CustomResourceDefinition `sitemanagers.qubership.org` and ValidatingWebhookConfiguration `site-manager-crd-validating-webhook-configuration` from [file](../../manifests/crd-sitemanager.yaml) as it will be described below. **Important**: You can skip this part, if you add `crd.install=true` to helm installation. @@ -103,7 +103,7 @@ To support the ability of services to be managed by `site-manager`, implement th apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: - name: sitemanagers.netcracker.com + name: sitemanagers.qubership.org annotations: cert-manager.io/inject-ca-from: /site-manager-tls-certificate ``` @@ -117,7 +117,7 @@ To support the ability of services to be managed by `site-manager`, implement th cert-manager.io/inject-ca-from: /site-manager-tls-certificate ``` - Create CustomResourceDefinition `sitemanagers.netcracker.com` and ValidatingWebhookConfiguration `site-manager-crd-validating-webhook-configuration` without caBundle field: + Create CustomResourceDefinition `sitemanagers.qubership.org` and ValidatingWebhookConfiguration `site-manager-crd-validating-webhook-configuration` without caBundle field: ```bash cat manifests/crd-sitemanager.yaml | sed "/caBundle/d" | kubectl apply -f - @@ -126,7 +126,7 @@ To support the ability of services to be managed by `site-manager`, implement th If you already had site-manager CRD or ValidatingWebhookConfiguration in your cloud and want to migrate to cert-manager integration, it is enough to annotate it: ```bash - kubectl annotate crds sitemanagers.netcracker.com cert-manager.io/inject-ca-from=/site-manager-tls-certificate + kubectl annotate crds sitemanagers.qubership.org cert-manager.io/inject-ca-from=/site-manager-tls-certificate kubectl annotate validatingwebhookconfigurations site-manager-crd-validating-webhook-configuration cert-manager.io/inject-ca-from=/site-manager-tls-certificate ``` @@ -136,7 +136,7 @@ To support the ability of services to be managed by `site-manager`, implement th apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: - name: sitemanagers.netcracker.com + name: sitemanagers.qubership.org annotations: service.alpha.openshift.io/inject-cabundle: "true" # for openshift 3.X service.beta.openshift.io/inject-cabundle: "true" # for openshift 4.X @@ -152,7 +152,7 @@ To support the ability of services to be managed by `site-manager`, implement th service.beta.openshift.io/inject-cabundle: "true" # for openshift 4.X ``` - Create CustomResourceDefinition `sitemanagers.netcracker.com` and ValidatingWebhookConfiguration `site-manager-crd-validating-webhook-configuration` without caBundle field: + Create CustomResourceDefinition `sitemanagers.qubership.org` and ValidatingWebhookConfiguration `site-manager-crd-validating-webhook-configuration` without caBundle field: ```bash cat manifests/crd-sitemanager.yaml | sed "/caBundle/d" | kubectl apply -f - @@ -161,9 +161,9 @@ To support the ability of services to be managed by `site-manager`, implement th If you already had site-manager CRD or ValidatingWebhookConfiguration in your cloud and want to migrate to integration with OpenShift service serving certificates mechanism, it is enough to annotate it (choose *alpha* or *beta* according your OpenShift version): ```bash - kubectl annotate crds sitemanagers.netcracker.com service.alpha.openshift.io/inject-cabundle=true + kubectl annotate crds sitemanagers.qubership.org service.alpha.openshift.io/inject-cabundle=true kubectl annotate validatingwebhookconfigurations service.alpha.openshift.io/inject-cabundle=true - kubectl annotate crds sitemanagers.netcracker.com service.beta.openshift.io/inject-cabundle=true + kubectl annotate crds sitemanagers.qubership.org service.beta.openshift.io/inject-cabundle=true kubectl annotate validatingwebhookconfigurations service.beta.openshift.io/inject-cabundle=true ``` @@ -173,7 +173,7 @@ To support the ability of services to be managed by `site-manager`, implement th CA_BUNDLE=$(cat ca.crt | base64 - | tr -d '\n') ``` - Create CRD `sitemanagers.netcracker.com` and ValidatingWebhookConfiguration `site-manager-crd-validating-webhook-configuration`: + Create CRD `sitemanagers.qubership.org` and ValidatingWebhookConfiguration `site-manager-crd-validating-webhook-configuration`: ```bash cat manifests/crd-sitemanager.yaml | sed "s//${CA_BUNDLE}/" | kubectl apply -f - @@ -197,7 +197,7 @@ To support the ability of services to be managed by `site-manager`, implement th | env.FRONT_HTTP_AUTH | Set the authentication mode between sm-client and Site-Manager. | "Yes" | | env.BACK_HTTP_AUTH | Set the authentication mode between Site-Manager and manageable services. | "Yes" | | env.SM_DEBUG | Set `debug` logging level. | "False" | -| env.SM_GROUP | Define API group for CRD. | "netcracker.com" | +| env.SM_GROUP | Define API group for CRD. | "qubership.org" | | env.SM_KIND | Define the kind of API group. | "SiteManager" | | env.SM_KIND_LIST | Define the kind for list API group. | "SiteManagerList" | | env.HTTP_SCHEME | Define the HTTP scheme for connection to microservice operator. | "http://" | @@ -348,11 +348,11 @@ peers. sites: - name: k8s-1 token: - site-manager: http://site-manager.k8s-1.netcracker.com/sitemanager + site-manager: http://site-manager.k8s-1.qubership.org/sitemanager cacert: - name: k8s-2 token: - site-manager: http://site-manager.k8s-2.netcracker.com/sitemanager + site-manager: http://site-manager.k8s-2.qubership.org/sitemanager cacert: sm-client: diff --git a/manifests/crd-sitemanager.yaml b/manifests/crd-sitemanager.yaml index eb07170e..b97df16a 100644 --- a/manifests/crd-sitemanager.yaml +++ b/manifests/crd-sitemanager.yaml @@ -1,9 +1,9 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: - name: sitemanagers.netcracker.com + name: sitemanagers.qubership.org spec: - group: netcracker.com + group: qubership.org names: kind: SiteManager listKind: SiteManagerList @@ -95,7 +95,7 @@ spec: served: true storage: false deprecated: true - deprecationWarning: "netcracker.com/v2 SiteManager is deprecated; use v3 and see actual version on https://github.com/Netcracker/DRNavigator#custom-resource-for-stateful" + deprecationWarning: "qubership.org/v2 SiteManager is deprecated; use v3 and see actual version on https://github.com/Netcracker/DRNavigator#custom-resource-for-stateful" subresources: status: {} schema: @@ -177,7 +177,7 @@ spec: served: false storage: false deprecated: true - deprecationWarning: "netcracker.com/v1 SiteManager is deprecated; use v2 and see actual version on https://github.com/Netcracker/DRNavigator#custom-resource-for-stateful" + deprecationWarning: "qubership.org/v1 SiteManager is deprecated; use v2 and see actual version on https://github.com/Netcracker/DRNavigator#custom-resource-for-stateful" subresources: status: {} schema: @@ -265,49 +265,49 @@ kind: ValidatingWebhookConfiguration metadata: name: "site-manager-crd-validating-webhook-configuration" webhooks: -- name: "site-manager-crd-validating-webhook-v3.netcracker.com" +- name: "site-manager-crd-validating-webhook-v3.qubership.org" admissionReviewVersions: ["v1"] clientConfig: service: namespace: site-manager name: site-manager - path: /validate-netcracker-com-v3-sitemanager + path: /validate-qubership-org-v3-sitemanager port: 442 caBundle: "" rules: - - apiGroups: ["netcracker.com"] + - apiGroups: ["qubership.org"] apiVersions: ["v3"] operations: ["CREATE", "UPDATE"] resources: ["sitemanagers"] scope: "Namespaced" sideEffects: None -- name: "site-manager-crd-validating-webhook-v2.netcracker.com" +- name: "site-manager-crd-validating-webhook-v2.qubership.org" admissionReviewVersions: ["v1"] clientConfig: service: namespace: site-manager name: site-manager - path: /validate-netcracker-com-v2-sitemanager + path: /validate-qubership-org-v2-sitemanager port: 442 caBundle: "" rules: - - apiGroups: ["netcracker.com"] + - apiGroups: ["qubership.org"] apiVersions: ["v2"] operations: ["CREATE", "UPDATE"] resources: ["sitemanagers"] scope: "Namespaced" sideEffects: None -- name: "site-manager-crd-validating-webhook-v1.netcracker.com" +- name: "site-manager-crd-validating-webhook-v1.qubership.org" admissionReviewVersions: ["v1"] clientConfig: service: namespace: site-manager name: site-manager - path: /validate-netcracker-com-v1-sitemanager + path: /validate-qubership-org-v1-sitemanager port: 442 caBundle: "" rules: - - apiGroups: ["netcracker.com"] + - apiGroups: ["qubership.org"] apiVersions: ["v1"] operations: ["CREATE", "UPDATE"] resources: ["sitemanagers"] diff --git a/site-manager/api/v3/cr_types.go b/site-manager/api/v3/cr_types.go index 7a87141b..0012b486 100644 --- a/site-manager/api/v3/cr_types.go +++ b/site-manager/api/v3/cr_types.go @@ -71,3 +71,31 @@ func (cr *CR) GetServiceName() string { } return fmt.Sprintf("%s.%s", cr.GetName(), cr.GetNamespace()) } + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// SecondaryCRList defines a list of SecondaryCR +type SecondaryCRList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []SecondaryCR `json:"items"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// SecondaryCR defines another CR kind in the same API group/version +type SecondaryCR struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec SecondaryCRSpec `json:"spec"` + Status SecondaryCRStatus `json:"status"` +} + +// +k8s:deepcopy-gen=true +type SecondaryCRSpec struct { + Value string `json:"value"` +} + +// +k8s:deepcopy-gen=true +type SecondaryCRStatus struct { + State string `json:"state"` +} diff --git a/site-manager/api/v3/groupversion_info.go b/site-manager/api/v3/groupversion_info.go index a857baf8..e49fda4b 100644 --- a/site-manager/api/v3/groupversion_info.go +++ b/site-manager/api/v3/groupversion_info.go @@ -12,6 +12,11 @@ func AddToScheme(s *runtime.Scheme) error { groupVersion := schema.GroupVersion{Group: envconfig.EnvConfig.CRGroup, Version: CRVersion} s.AddKnownTypeWithName(groupVersion.WithKind(envconfig.EnvConfig.CRKind), &CR{}) s.AddKnownTypeWithName(groupVersion.WithKind(envconfig.EnvConfig.CRKindList), &CRList{}) + + // Register secondary CR + s.AddKnownTypeWithName(groupVersion.WithKind("SecondaryCR"), &SecondaryCR{}) + s.AddKnownTypeWithName(groupVersion.WithKind("SecondaryCRList"), &SecondaryCRList{}) + metav1.AddToGroupVersion(s, groupVersion) return nil } diff --git a/site-manager/api/v3/zz_generated.deepcopy.go b/site-manager/api/v3/zz_generated.deepcopy.go index 50d70c0d..0a73b0db 100644 --- a/site-manager/api/v3/zz_generated.deepcopy.go +++ b/site-manager/api/v3/zz_generated.deepcopy.go @@ -5,7 +5,7 @@ package v3 import ( - runtime "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime" ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. @@ -158,3 +158,92 @@ func (in *CRStatus) DeepCopy() *CRStatus { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SecondaryCR) DeepCopyInto(out *SecondaryCR) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + out.Status = in.Status +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecondaryCR. +func (in *SecondaryCR) DeepCopy() *SecondaryCR { + if in == nil { + return nil + } + out := new(SecondaryCR) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *SecondaryCR) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SecondaryCRList) DeepCopyInto(out *SecondaryCRList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]SecondaryCR, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecondaryCRList. +func (in *SecondaryCRList) DeepCopy() *SecondaryCRList { + if in == nil { + return nil + } + out := new(SecondaryCRList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *SecondaryCRList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SecondaryCRSpec) DeepCopyInto(out *SecondaryCRSpec) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecondaryCRSpec. +func (in *SecondaryCRSpec) DeepCopy() *SecondaryCRSpec { + if in == nil { + return nil + } + out := new(SecondaryCRSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SecondaryCRStatus) DeepCopyInto(out *SecondaryCRStatus) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecondaryCRStatus. +func (in *SecondaryCRStatus) DeepCopy() *SecondaryCRStatus { + if in == nil { + return nil + } + out := new(SecondaryCRStatus) + in.DeepCopyInto(out) + return out +} diff --git a/site-manager/cmd/root.go b/site-manager/cmd/root.go index a4377ece..bbf5699e 100644 --- a/site-manager/cmd/root.go +++ b/site-manager/cmd/root.go @@ -187,7 +187,7 @@ func ServeApp(cmd *cobra.Command, args []string) { }, WebhookServer: webhookServer, LeaderElection: !devMode, - LeaderElectionID: "sitemanagers.netcracker.com", + LeaderElectionID: "sitemanagers.qubership.org", LeaderElectionNamespace: envconfig.EnvConfig.PodNamespace, }); err != nil { setupLog.Error(err, "unable to start manager") @@ -247,7 +247,7 @@ func ServeApp(cmd *cobra.Command, args []string) { // handle token if authorization is enabled in separate gorutine if !smConfig.Testing.Enabled && envconfig.EnvConfig.BackHttpAuth { - go func () { + go func() { errorChannel <- tokenWatcher.Start() }() } diff --git a/site-manager/config/config.go b/site-manager/config/config.go index aef42f70..13dd1898 100644 --- a/site-manager/config/config.go +++ b/site-manager/config/config.go @@ -19,7 +19,8 @@ type Config struct { SMCaCert string `envconfig:"SM_CACERT" default:"True"` // cr configuration - CRGroup string `envconfig:"SM_GROUP" default:"netcracker.com"` + CRGroup string `envconfig:"SM_GROUP" default:"qubership.org"` + CRScGroup string `envconfig:"SM_SecGroup" default:"netcracker.com"` CRKind string `envconfig:"SM_KIND" default:"SiteManager"` CRKindList string `envconfig:"SM_KIND_LIST" default:"SiteManagerList"` diff --git a/site-manager/internal/controller/cr_controller.go b/site-manager/internal/controller/cr_controller.go index 4274a09f..31a1cb19 100644 --- a/site-manager/internal/controller/cr_controller.go +++ b/site-manager/internal/controller/cr_controller.go @@ -20,33 +20,52 @@ type crReconciler struct { // SetupCRReconciler creates and regists CR reconciler for SM CRs func SetupCRReconciler(crClient cr_client.CRClient, mgr ctrl.Manager) error { reconciler := crReconciler{crClient: crClient} - return ctrl.NewControllerManagedBy(mgr). + // return ctrl.NewControllerManagedBy(mgr). + if err := ctrl.NewControllerManagedBy(mgr). For(&crv3.CR{}). - Complete(&reconciler) + Complete(&reconciler); err != nil { + log.Log.Error(err, "Failed to set up CR controller") + + } + + if err := ctrl.NewControllerManagedBy(mgr). + For(&crv3.SecondaryCR{}). + Complete(&reconciler); err != nil { + log.Log.Error(err, "Failed to set up SecondaryCR controller") + + } + return nil } // Reconcile is called, if reconciler handles changes in SM object func (crr *crReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { logger := log.FromContext(ctx) + // Try to fetch CR first cr, err := crr.crClient.Get(ctx, req.Namespace, req.Name, &client.GetOptions{}) - if err != nil && errors.IsNotFound(err) { - // Object is removed - logger.V(1).Info("SM CR is not found. Ignoring since object must be deleted") + if err == nil { + newStatus := crv3.CRStatus{Summary: "Accepted", ServiceName: cr.GetServiceName()} + if !reflect.DeepEqual(cr.Status, newStatus) { + cr.Status = newStatus + if err := crr.crClient.UpdateStatus(ctx, cr, &client.SubResourceUpdateOptions{}); err != nil { + logger.Error(err, "Failed to update status for CR") + return ctrl.Result{}, err + } + logger.V(1).Info("CR status updated") + } return ctrl.Result{}, nil - } else if err != nil { - // Error getting object - logger.Error(err, "Failed to get SM CR") - return ctrl.Result{}, err } - // Update status - newStatus := crv3.CRStatus{Summary: "Accepted", ServiceName: cr.GetServiceName()} - if !reflect.DeepEqual(cr.Status, newStatus) { - cr.Status = newStatus - if err := crr.crClient.UpdateStatus(ctx, cr, &client.SubResourceUpdateOptions{}); err != nil { - logger.Error(err, "Failed update status for CR") - return ctrl.Result{}, err + // If not CR, try to fetch SecondaryCR + secCR, err := crr.crClient.GetSecondary(ctx, req.Namespace, req.Name, &client.GetOptions{}) + if err != nil { + if errors.IsNotFound(err) { + logger.V(1).Info("CR or SecondaryCR not found. Probably deleted.") + return ctrl.Result{}, nil } - logger.V(1).Info("Status updated") + logger.Error(err, "Failed to get SecondaryCR") + return ctrl.Result{}, err } + + // Handle SecondaryCR (you can add status update here as needed) + logger.V(1).Info("Reconciled SecondaryCR", "name", secCR.Name) return ctrl.Result{}, nil } diff --git a/site-manager/pkg/client/cr/cr_client.go b/site-manager/pkg/client/cr/cr_client.go index 6f70467c..66f35451 100644 --- a/site-manager/pkg/client/cr/cr_client.go +++ b/site-manager/pkg/client/cr/cr_client.go @@ -19,6 +19,7 @@ type CRClient interface { Get(ctx context.Context, namespace string, name string, opts *client.GetOptions) (*crv3.CR, error) // UpdateStatus updates the status for given CR UpdateStatus(ctx context.Context, obj *crv3.CR, opts *client.SubResourceUpdateOptions) error + GetSecondary(ctx context.Context, namespace, name string, opts *client.GetOptions) (*crv3.SecondaryCR, error) } // crClient is implementation of CRClient @@ -48,6 +49,14 @@ func (crc *crClient) Get(ctx context.Context, namespace string, name string, opt return obj, err } +// Get returns secondary CR object with specified name and namespace +func (crc *crClient) GetSecondary(ctx context.Context, namespace, name string, + opts *client.GetOptions) (*crv3.SecondaryCR, error) { + secondary := &crv3.SecondaryCR{} + err := crc.kubeClient.Get(ctx, types.NamespacedName{Name: name, Namespace: namespace}, secondary, opts) + return secondary, err +} + // UpdateStatus updates the status for given CR func (crc *crClient) UpdateStatus(ctx context.Context, obj *crv3.CR, opts *client.SubResourceUpdateOptions) error { return crc.kubeClient.Status().Update(ctx, obj, opts) diff --git a/site-manager/tests/cr_manager_get_services_test.go b/site-manager/tests/cr_manager_get_services_test.go index dd7c446a..f021b814 100644 --- a/site-manager/tests/cr_manager_get_services_test.go +++ b/site-manager/tests/cr_manager_get_services_test.go @@ -59,7 +59,7 @@ func TestCRManager_MappingDefaults(t *testing.T) { } emptyCR := crv3.CR{ TypeMeta: v1.TypeMeta{ - APIVersion: "netcracker.com/v3", + APIVersion: "qubership.org/v3", Kind: "SiteManager", }, ObjectMeta: v1.ObjectMeta{ diff --git a/site-manager/tests/data/test_objects.go b/site-manager/tests/data/test_objects.go index cc9c5a6c..4ca70c0d 100644 --- a/site-manager/tests/data/test_objects.go +++ b/site-manager/tests/data/test_objects.go @@ -36,7 +36,7 @@ var ( } ServiceV1 = crv1.CR{ TypeMeta: v1.TypeMeta{ - APIVersion: "netcracker.com/v1", + APIVersion: "qubership.org/v1", Kind: "SiteManager", }, ObjectMeta: v1.ObjectMeta{ @@ -87,7 +87,7 @@ var ( } ServiceV2 = crv2.CR{ TypeMeta: v1.TypeMeta{ - APIVersion: "netcracker.com/v2", + APIVersion: "qubership.org/v2", Kind: "SiteManager", }, ObjectMeta: v1.ObjectMeta{ @@ -139,7 +139,7 @@ var ( } ServiceV3 = crv3.CR{ TypeMeta: v1.TypeMeta{ - APIVersion: "netcracker.com/v3", + APIVersion: "qubership.org/v3", Kind: "SiteManager", }, ObjectMeta: v1.ObjectMeta{ diff --git a/site-manager/tests/validator_test.go b/site-manager/tests/validator_test.go index 08259cce..bc58f608 100644 --- a/site-manager/tests/validator_test.go +++ b/site-manager/tests/validator_test.go @@ -62,7 +62,7 @@ func createCRFromTemplate(name string, namespace string, uid types.UID, alias *s case crv1.CRVersion: return &crv1.CR{ TypeMeta: v1.TypeMeta{ - APIVersion: "netcracker.com/v1", + APIVersion: "qubership.org/v1", Kind: "SiteManager", }, ObjectMeta: v1.ObjectMeta{ @@ -74,7 +74,7 @@ func createCRFromTemplate(name string, namespace string, uid types.UID, alias *s case crv2.CRVersion: return &crv2.CR{ TypeMeta: v1.TypeMeta{ - APIVersion: "netcracker.com/v2", + APIVersion: "qubership.org/v2", Kind: "SiteManager", }, ObjectMeta: v1.ObjectMeta{ @@ -86,7 +86,7 @@ func createCRFromTemplate(name string, namespace string, uid types.UID, alias *s case crv3.CRVersion: return &crv3.CR{ TypeMeta: v1.TypeMeta{ - APIVersion: "netcracker.com/v3", + APIVersion: "qubership.org/v3", Kind: "SiteManager", }, ObjectMeta: v1.ObjectMeta{ diff --git a/tests/selftest/sm_client/resources/config_test.yaml b/tests/selftest/sm_client/resources/config_test.yaml index 2d9e7cb2..424bd297 100644 --- a/tests/selftest/sm_client/resources/config_test.yaml +++ b/tests/selftest/sm_client/resources/config_test.yaml @@ -1,10 +1,10 @@ sites: - name: k8s-1 token: XXX - site-manager: https://site-manager.k8s-1.netcracker.com/sitemanager + site-manager: https://site-manager.k8s-1.qubership.org/sitemanager - name: k8s-2 token: XXX - site-manager: https://site-manager.k8s-2.netcracker.com/sitemanager + site-manager: https://site-manager.k8s-2.qubership.org/sitemanager sm-client: http_auth: True service_default_timeout: 400 diff --git a/tests/selftest/sm_client/resources/config_test_correct_states.yaml b/tests/selftest/sm_client/resources/config_test_correct_states.yaml index c4d4be16..c93239f0 100644 --- a/tests/selftest/sm_client/resources/config_test_correct_states.yaml +++ b/tests/selftest/sm_client/resources/config_test_correct_states.yaml @@ -1,10 +1,10 @@ sites: - name: k8s-1 token: XXX - site-manager: https://site-manager.k8s-1.netcracker.com/sitemanager + site-manager: https://site-manager.k8s-1.qubership.org/sitemanager - name: k8s-2 token: XXX - site-manager: https://site-manager.k8s-2.netcracker.com/sitemanager + site-manager: https://site-manager.k8s-2.qubership.org/sitemanager sm-client: http_auth: True diff --git a/tests/selftest/sm_client/resources/config_test_states_without_brackets.yaml b/tests/selftest/sm_client/resources/config_test_states_without_brackets.yaml index 65da3a00..06816d9d 100644 --- a/tests/selftest/sm_client/resources/config_test_states_without_brackets.yaml +++ b/tests/selftest/sm_client/resources/config_test_states_without_brackets.yaml @@ -1,10 +1,10 @@ sites: - name: k8s-1 token: XXX - site-manager: https://site-manager.k8s-1.netcracker.com/sitemanager + site-manager: https://site-manager.k8s-1.qubership.org/sitemanager - name: k8s-2 token: XXX - site-manager: https://site-manager.k8s-2.netcracker.com/sitemanager + site-manager: https://site-manager.k8s-2.qubership.org/sitemanager sm-client: http_auth: True diff --git a/tests/selftest/sm_client/resources/config_test_with_env_token.yaml b/tests/selftest/sm_client/resources/config_test_with_env_token.yaml index d10a41ec..78c2b468 100644 --- a/tests/selftest/sm_client/resources/config_test_with_env_token.yaml +++ b/tests/selftest/sm_client/resources/config_test_with_env_token.yaml @@ -1,11 +1,11 @@ sites: - name: k8s-1 token: XXX - site-manager: https://site-manager.k8s-1.netcracker.com/sitemanager + site-manager: https://site-manager.k8s-1.qubership.org/sitemanager - name: k8s-2 token: from_env: SM_TEST_TOKEN - site-manager: https://site-manager.k8s-2.netcracker.com/sitemanager + site-manager: https://site-manager.k8s-2.qubership.org/sitemanager sm-client: http_auth: True service_default_timeout: 400 diff --git a/tests/selftest/sm_client/resources/config_test_with_restrictions.yaml b/tests/selftest/sm_client/resources/config_test_with_restrictions.yaml index b5c0e16c..73b66ed3 100644 --- a/tests/selftest/sm_client/resources/config_test_with_restrictions.yaml +++ b/tests/selftest/sm_client/resources/config_test_with_restrictions.yaml @@ -1,10 +1,10 @@ sites: - name: k8s-1 token: XXX - site-manager: https://site-manager.k8s-1.netcracker.com/sitemanager + site-manager: https://site-manager.k8s-1.qubership.org/sitemanager - name: k8s-2 token: XXX - site-manager: https://site-manager.k8s-2.netcracker.com/sitemanager + site-manager: https://site-manager.k8s-2.qubership.org/sitemanager sm-client: http_auth: True service_default_timeout: 400 diff --git a/tests/selftest/sm_client/resources/config_test_wrong.yaml b/tests/selftest/sm_client/resources/config_test_wrong.yaml index 65853bd7..c9a8ff09 100644 --- a/tests/selftest/sm_client/resources/config_test_wrong.yaml +++ b/tests/selftest/sm_client/resources/config_test_wrong.yaml @@ -1,13 +1,13 @@ sites: - name: k8s-1 token: XXX - site-manager: https://site-manager.k8s-1.netcracker.com/sitemanager + site-manager: https://site-manager.k8s-1.qubership.org/sitemanager - name: k8s-2 token: XXX - site-manager: https://site-manager.k8s-2.netcracker.com/sitemanager + site-manager: https://site-manager.k8s-2.qubership.org/sitemanager - name: k8s-3 token: XXX - site-manager: https://site-manager.k8s-4.netcracker.com/sitemanager + site-manager: https://site-manager.k8s-4.qubership.org/sitemanager sm-client: http_auth: True service_default_timeout: 400 diff --git a/tests/selftest/sm_client/resources/config_test_wrong_states.yaml b/tests/selftest/sm_client/resources/config_test_wrong_states.yaml index d0960b9d..77226b97 100644 --- a/tests/selftest/sm_client/resources/config_test_wrong_states.yaml +++ b/tests/selftest/sm_client/resources/config_test_wrong_states.yaml @@ -1,10 +1,10 @@ sites: - name: k8s-1 token: XXX - site-manager: http://site-manager.k8s-1.netcracker.com/sitemanager + site-manager: http://site-manager.k8s-1.qubership.org/sitemanager - name: k8s-2 token: XXX - site-manager: http://site-manager.k8s-2.netcracker.com/sitemanager + site-manager: http://site-manager.k8s-2.qubership.org/sitemanager sm-client: http_auth: True diff --git a/tests/selftest/sm_client/resources/config_test_wrong_with_env_token.yaml b/tests/selftest/sm_client/resources/config_test_wrong_with_env_token.yaml index c3da0170..199d951f 100644 --- a/tests/selftest/sm_client/resources/config_test_wrong_with_env_token.yaml +++ b/tests/selftest/sm_client/resources/config_test_wrong_with_env_token.yaml @@ -1,11 +1,11 @@ sites: - name: k8s-1 token: XXX - site-manager: https://site-manager.k8s-1.netcracker.com/sitemanager + site-manager: https://site-manager.k8s-1.qubership.org/sitemanager - name: k8s-2 token: from_env_wrong: SM_TEST_TOKEN - site-manager: https://site-manager.k8s-2.netcracker.com/sitemanager + site-manager: https://site-manager.k8s-2.qubership.org/sitemanager sm-client: http_auth: True service_default_timeout: 400 diff --git a/tests/sm-dummy/charts/sm-dummy/templates/site-manager-cr.yaml b/tests/sm-dummy/charts/sm-dummy/templates/site-manager-cr.yaml index 316447ab..22865f6e 100644 --- a/tests/sm-dummy/charts/sm-dummy/templates/site-manager-cr.yaml +++ b/tests/sm-dummy/charts/sm-dummy/templates/site-manager-cr.yaml @@ -1,6 +1,6 @@ {{- if .Values.siteManager.installCR }} --- -apiVersion: netcracker.com/v3 +apiVersion: qubership.org/v3 kind: SiteManager metadata: name: {{ .Values.name }}