diff --git a/apis/identity/v1alpha1/openapi_generated.go b/apis/identity/v1alpha1/openapi_generated.go index a4db3fa2d6..91e05eb947 100644 --- a/apis/identity/v1alpha1/openapi_generated.go +++ b/apis/identity/v1alpha1/openapi_generated.go @@ -19948,6 +19948,34 @@ func schema_resource_metadata_apis_identity_v1alpha1_KubernetesInfo(ref common.R Ref: ref("kmodules.xyz/resource-metadata/apis/identity/v1alpha1.NodeInfo"), }, }, + "distributions": { + SchemaProps: spec.SchemaProps{ + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "storageProvisioners": { + SchemaProps: spec.SchemaProps{ + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, }, Required: []string{"nodeStats"}, }, diff --git a/apis/identity/v1alpha1/siteinfo_types.go b/apis/identity/v1alpha1/siteinfo_types.go index 20da75a84f..ac3d540f75 100644 --- a/apis/identity/v1alpha1/siteinfo_types.go +++ b/apis/identity/v1alpha1/siteinfo_types.go @@ -72,11 +72,13 @@ type KubernetesInfo struct { // Deprecated ClusterName string `json:"clusterName,omitempty"` // Deprecated - ClusterUID string `json:"clusterUID,omitempty"` - Cluster *kmapi.ClusterMetadata `json:"cluster,omitempty"` - Version *version.Info `json:"version,omitempty"` - ControlPlane *ControlPlaneInfo `json:"controlPlane,omitempty"` - NodeStats NodeInfo `json:"nodeStats"` + ClusterUID string `json:"clusterUID,omitempty"` + Cluster *kmapi.ClusterMetadata `json:"cluster,omitempty"` + Version *version.Info `json:"version,omitempty"` + ControlPlane *ControlPlaneInfo `json:"controlPlane,omitempty"` + NodeStats NodeInfo `json:"nodeStats"` + Distributions []string `json:"distributions,omitempty"` + StorageProvisioners []string `json:"storageProvisioners,omitempty"` } // https://github.com/kmodules/client-go/blob/kubernetes-1.16.3/tools/analytics/analytics.go#L66 diff --git a/apis/identity/v1alpha1/zz_generated.deepcopy.go b/apis/identity/v1alpha1/zz_generated.deepcopy.go index 9c187201db..6005bc37a7 100644 --- a/apis/identity/v1alpha1/zz_generated.deepcopy.go +++ b/apis/identity/v1alpha1/zz_generated.deepcopy.go @@ -214,6 +214,16 @@ func (in *KubernetesInfo) DeepCopyInto(out *KubernetesInfo) { (*in).DeepCopyInto(*out) } in.NodeStats.DeepCopyInto(&out.NodeStats) + if in.Distributions != nil { + in, out := &in.Distributions, &out.Distributions + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.StorageProvisioners != nil { + in, out := &in.StorageProvisioners, &out.StorageProvisioners + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/crds/identity.k8s.appscode.com_siteinfos.yaml b/crds/identity.k8s.appscode.com_siteinfos.yaml index 6ab90269d4..18f75a9c10 100644 --- a/crds/identity.k8s.appscode.com_siteinfos.yaml +++ b/crds/identity.k8s.appscode.com_siteinfos.yaml @@ -121,6 +121,10 @@ spec: - notAfter - notBefore type: object + distributions: + items: + type: string + type: array nodeStats: properties: allocatable: @@ -202,6 +206,10 @@ spec: type: integer type: object type: object + storageProvisioners: + items: + type: string + type: array version: description: |- Info contains versioning information. diff --git a/pkg/identity/siteinfo.go b/pkg/identity/siteinfo.go index e0f8f131f0..6b4a0b4061 100644 --- a/pkg/identity/siteinfo.go +++ b/pkg/identity/siteinfo.go @@ -21,6 +21,7 @@ import ( "net" "strings" + kmapi "kmodules.xyz/client-go/api/v1" clustermeta "kmodules.xyz/client-go/cluster" "kmodules.xyz/client-go/tools/clusterid" identityapi "kmodules.xyz/resource-metadata/apis/identity/v1alpha1" @@ -31,8 +32,10 @@ import ( core "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/client-go/discovery/cached/memory" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" + "k8s.io/client-go/restmapper" ) func GetSiteInfo(cfg *rest.Config, kc kubernetes.Interface, nodes []*core.Node, licenseID string) (*identityapi.SiteInfo, error) { @@ -128,6 +131,19 @@ func GetSiteInfo(cfg *rest.Config, kc kubernetes.Interface, nodes []*core.Node, si.Kubernetes.ControlPlane.URIs = uris } + si.Kubernetes.Distributions = DetectDistributions(kc) + + scList, err := kc.StorageV1().StorageClasses().List(context.Background(), metav1.ListOptions{}) + scProvisioners := sets.NewString() + if err == nil { + for _, sc := range scList.Items { + scProvisioners.Insert(sc.Provisioner) + } + } + if scProvisioners.Len() > 0 { + si.Kubernetes.StorageProvisioners = scProvisioners.List() + } + if len(nodes) == 0 { result, err := kc.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{}) if err != nil { @@ -188,3 +204,16 @@ func skipIP(ip net.IP) bool { ip.IsLinkLocalMulticast() || ip.IsLinkLocalUnicast() } + +func DetectDistributions(kc kubernetes.Interface) []string { + mapper := restmapper.NewDeferredDiscoveryRESTMapper(memory.NewMemCacheClient(kc.Discovery())) + + distros := sets.NewString() + if clustermeta.IsRancherManaged(mapper) { + distros.Insert(kmapi.ClusterManagerRancher.Name()) + } + if clustermeta.IsOpenShiftManaged(mapper) { + distros.Insert(kmapi.ClusterManagerOpenShift.Name()) + } + return distros.List() +}