-
Notifications
You must be signed in to change notification settings - Fork 12
/
cluster_info.go
142 lines (124 loc) · 4.27 KB
/
cluster_info.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package openshift
import (
"context"
"errors"
yaml "gopkg.in/yaml.v2"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
typedCorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
logf "sigs.k8s.io/controller-runtime/pkg/log"
)
var log = logf.Log.WithName("openshift_cluster_info")
// ClusterConfig is a struct that incorporates v1alpha1.KubemanagerClusterInfo interface
type ClusterConfig struct {
Client typedCorev1.CoreV1Interface
DynamicClient dynamic.Interface
}
// KubernetesAPISSLPort gathers SSL Port from Openshift Cluster via console-config ConfigMap
func (c ClusterConfig) KubernetesAPISSLPort() (int, error) {
kubernetesEndpoint, err := c.Client.Endpoints("default").Get(context.Background(), "kubernetes", metav1.GetOptions{})
if err != nil {
return 0, err
}
if len(kubernetesEndpoint.Subsets) == 0 {
return 0, errors.New("No subsets found")
}
for _, port := range kubernetesEndpoint.Subsets[0].Ports {
if port.Name == "https" {
return int(port.Port), nil
}
}
return 0, errors.New("No https port found")
}
// KubernetesAPIServer gathers API Server name from Openshift Cluster via console-config ConfigMap
func (c ClusterConfig) KubernetesAPIServer() (string, error) {
u, err := c.DynamicClient.Resource(
schema.GroupVersionResource{
Group: "config.openshift.io",
Version: "v1",
Resource: "dnses",
}).Get(context.Background(), "cluster", metav1.GetOptions{})
if err != nil {
return "", err
}
apiServer, _, err := unstructured.NestedString(u.Object, "spec", "baseDomain")
if err != nil {
return "", err
}
return "api." + apiServer, nil
}
// KubernetesClusterName gathers cluster name from Openshift Cluster via cluster-config-v1 ConfigMap
func (c ClusterConfig) KubernetesClusterName() (string, error) {
installConfigMap, err := getInstallConfig(c.Client)
if err != nil {
return "", err
}
kubernetesClusterName := installConfigMap.Metadata.Name
return kubernetesClusterName, nil
}
// PodSubnets gathers pods' subnet from Openshift Cluster via cluster-config-v1 ConfigMap
func (c ClusterConfig) PodSubnets() (string, error) {
installConfigMap, err := getInstallConfig(c.Client)
if err != nil {
return "", err
}
clusterNetwork := installConfigMap.Networking.ClusterNetwork
if len(clusterNetwork) > 1 {
netLogger := log.WithValues("clusterNetwork", clusterNetwork)
netLogger.Info("Found more than one cluster networks.")
}
podSubnets := clusterNetwork[0].CIDR
return podSubnets, nil
}
// ServiceSubnets gathers service subnet from Openshift Cluster via cluster-config-v1 ConfigMap
func (c ClusterConfig) ServiceSubnets() (string, error) {
installConfigMap, err := getInstallConfig(c.Client)
if err != nil {
return "", err
}
serviceNetwork := installConfigMap.Networking.ServiceNetwork
if len(serviceNetwork) > 1 {
netLogger := log.WithValues("serviceNetwork", serviceNetwork)
netLogger.Info("Found more than one service networks.")
}
serviceSubnets := serviceNetwork[0]
return serviceSubnets, nil
}
// CNIBinariesDirectory returns directory containing CNI binaries specific for k8s cluster
func (c ClusterConfig) CNIBinariesDirectory() string {
return "/var/lib/cni/bin"
}
// DeploymentType returns deployment type
func (c ClusterConfig) DeploymentType() string {
return "openshift"
}
func getInstallConfig(client typedCorev1.CoreV1Interface) (installConfig, error) {
kubeadmConfigMapClient := client.ConfigMaps("kube-system")
ccm, err := kubeadmConfigMapClient.Get(context.Background(), "cluster-config-v1", metav1.GetOptions{})
if err != nil {
return installConfig{}, err
}
installConfigSection := ccm.Data["install-config"]
installConfigByte := []byte(installConfigSection)
installConfigMap := installConfig{}
if err = yaml.Unmarshal(installConfigByte, &installConfigMap); err != nil {
return installConfig{}, err
}
return installConfigMap, nil
}
type installConfig struct {
Metadata metadata `yaml:"metadata"`
Networking networking `yaml:"networking"`
}
type metadata struct {
Name string `yaml:"name"`
}
type networking struct {
ClusterNetwork []clusterNetwork `yaml:"clusterNetwork"`
ServiceNetwork []string `yaml:"serviceNetwork"`
}
type clusterNetwork struct {
CIDR string `yaml:"cidr"`
}