Skip to content

Commit 809f433

Browse files
Merge pull request #183 from tremes/machineset
Bug 1881816: Gather MachineSet info
2 parents 6bbde95 + 54e1d84 commit 809f433

File tree

11 files changed

+1019
-2
lines changed

11 files changed

+1019
-2
lines changed

docs/gathered-data.md

+20
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,26 @@ Specifically, the age of pods, the set of running images and the container names
167167
Location in archive: config/running_containers.json
168168

169169

170+
## HostSubnet
171+
172+
collects HostSubnet information
173+
174+
The Kubernetes api https://github.com/openshift/client-go/blob/master/network/clientset/versioned/typed/network/v1/hostsubnet.go
175+
Response see https://docs.openshift.com/container-platform/4.3/rest_api/index.html#hostsubnet-v1-network-openshift-io
176+
177+
Location in archive: config/hostsubnet/
178+
179+
180+
## MachineSet
181+
182+
collects MachineSet information
183+
184+
The Kubernetes api https://github.com/openshift/machine-api-operator/blob/master/pkg/generated/clientset/versioned/typed/machine/v1beta1/machineset.go
185+
Response see https://docs.openshift.com/container-platform/4.3/rest_api/index.html#machineset-v1beta1-machine-openshift-io
186+
187+
Location in archive: machinesets/
188+
189+
170190
## MostRecentMetrics
171191

172192
gathers cluster Federated Monitoring metrics.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"apiVersion":"machine.openshift.io/v1beta1","kind":"MachineSet","metadata":{"creationTimestamp":"2020-09-23T10:11:50Z","generation":1,"labels":{"machine.openshift.io/cluster-api-cluster":"d50d0126-c90b-4428-a75f-dc08cd02960a"},"managedFields":[{"apiVersion":"machine.openshift.io/v1beta1","fieldsType":"FieldsV1","fieldsV1":{"f:metadata":{"f:labels":{".":{},"f:machine.openshift.io/cluster-api-cluster":{}}},"f:spec":{".":{},"f:replicas":{},"f:selector":{".":{},"f:matchLabels":{".":{},"f:machine.openshift.io/cluster-api-cluster":{},"f:machine.openshift.io/cluster-api-machineset":{}}},"f:template":{".":{},"f:metadata":{".":{},"f:labels":{".":{},"f:machine.openshift.io/cluster-api-cluster":{},"f:machine.openshift.io/cluster-api-machine-role":{},"f:machine.openshift.io/cluster-api-machine-type":{},"f:machine.openshift.io/cluster-api-machineset":{}}},"f:spec":{".":{},"f:metadata":{".":{},"f:labels":{".":{},"f:node-role.kubernetes.io/\u003crole\u003e":{}}},"f:providerSpec":{".":{},"f:value":{".":{},"f:ami":{},"f:apiVersion":{},"f:blockDevices":{},"f:credentialsSecret":{},"f:deviceIndex":{},"f:iamInstanceProfile":{},"f:instanceType":{},"f:kind":{},"f:placement":{},"f:securityGroups":{},"f:subnet":{},"f:tags":{},"f:userDataSecret":{}}}}}}},"manager":"oc","operation":"Update","time":"2020-09-23T10:11:50Z"}],"name":"d50d0126-c90b-4428-a75f-dc08cd02960a-worker-test","namespace":"openshift-machine-api","resourceVersion":"1808428","selfLink":"/apis/machine.openshift.io/v1beta1/namespaces/openshift-machine-api/machinesets/d50d0126-c90b-4428-a75f-dc08cd02960a-worker-test","uid":"4418b628-163e-43b2-979a-1db7b4ed57ad"},"spec":{"replicas":1,"selector":{"matchLabels":{"machine.openshift.io/cluster-api-cluster":"d50d0126-c90b-4428-a75f-dc08cd02960a","machine.openshift.io/cluster-api-machineset":"d50d0126-c90b-4428-a75f-dc08cd02960a-worker-test"}},"template":{"metadata":{"labels":{"machine.openshift.io/cluster-api-cluster":"d50d0126-c90b-4428-a75f-dc08cd02960a","machine.openshift.io/cluster-api-machine-role":"worker","machine.openshift.io/cluster-api-machine-type":"worker","machine.openshift.io/cluster-api-machineset":"d50d0126-c90b-4428-a75f-dc08cd02960a-worker-test"}},"spec":{"metadata":{"labels":{"node-role.kubernetes.io/\u003crole\u003e":""}},"providerSpec":{"value":{"ami":{"id":"ami-046fe691f52a953f9"},"apiVersion":"awsproviderconfig.openshift.io/v1beta1","blockDevices":[{"ebs":{"iops":0,"volumeSize":120,"volumeType":"gp2"}}],"credentialsSecret":{"name":"aws-cloud-credentials"},"deviceIndex":0,"iamInstanceProfile":{"id":"d50d0126-c90b-4428-a75f-dc08cd02960a-worker-profile"},"instanceType":"m4.large","kind":"AWSMachineProviderConfig","placement":{"availabilityZone":"us-east-1a","region":"us-east-1"},"securityGroups":[{"filters":[{"name":"tag:Name","values":["d50d0126-c90b-4428-a75f-dc08cd02960a-worker-sg"]}]}],"subnet":{"filters":[{"name":"tag:Name","values":["d50d0126-c90b-4428-a75f-dc08cd02960a-worker-test"]}]},"tags":[{"name":"kubernetes.io/cluster/d50d0126-c90b-4428-a75f-dc08cd02960a","value":"owned"}],"userDataSecret":{"name":"worker-user-data"}}}}}}}

pkg/controller/operator.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
apixv1beta1client "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1"
1212
"k8s.io/apimachinery/pkg/runtime"
1313
"k8s.io/apimachinery/pkg/runtime/schema"
14+
"k8s.io/client-go/dynamic"
1415
"k8s.io/client-go/kubernetes"
1516
"k8s.io/client-go/kubernetes/scheme"
1617
"k8s.io/client-go/pkg/version"
@@ -126,6 +127,11 @@ func (s *Support) Run(ctx context.Context, controller *controllercmd.ControllerC
126127
return err
127128
}
128129

130+
dynamicClient, err := dynamic.NewForConfig(gatherKubeConfig)
131+
if err != nil {
132+
return err
133+
}
134+
129135
// ensure the insight snapshot directory exists
130136
if _, err := os.Stat(s.StoragePath); err != nil && os.IsNotExist(err) {
131137
if err := os.MkdirAll(s.StoragePath, 0777); err != nil {
@@ -148,7 +154,7 @@ func (s *Support) Run(ctx context.Context, controller *controllercmd.ControllerC
148154

149155
// the gatherers periodically check the state of the cluster and report any
150156
// config to the recorder
151-
configPeriodic := clusterconfig.New(gatherConfigClient, gatherKubeClient.CoreV1(), gatherKubeClient.CertificatesV1beta1(), metricsClient, registryClient.ImageregistryV1(), crdClient, gatherNetworkClient)
157+
configPeriodic := clusterconfig.New(gatherConfigClient, gatherKubeClient.CoreV1(), gatherKubeClient.CertificatesV1beta1(), metricsClient, registryClient.ImageregistryV1(), crdClient, gatherNetworkClient, dynamicClient)
152158
periodic := periodic.New(configObserver, recorder, map[string]gather.Interface{
153159
"config": configPeriodic,
154160
})

pkg/gather/clusterconfig/clusterconfig.go

+33-1
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@ import (
2020
"k8s.io/apimachinery/pkg/api/errors"
2121
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2222
"k8s.io/apimachinery/pkg/runtime"
23+
"k8s.io/apimachinery/pkg/runtime/schema"
2324
"k8s.io/apimachinery/pkg/runtime/serializer"
2425
"k8s.io/apimachinery/pkg/util/json"
2526
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
2627
"k8s.io/apimachinery/pkg/util/sets"
28+
"k8s.io/client-go/dynamic"
2729
kubescheme "k8s.io/client-go/kubernetes/scheme"
2830
certificatesv1beta1 "k8s.io/client-go/kubernetes/typed/certificates/v1beta1"
2931
corev1client "k8s.io/client-go/kubernetes/typed/core/v1"
@@ -93,6 +95,7 @@ type Gatherer struct {
9395
client configv1client.ConfigV1Interface
9496
coreClient corev1client.CoreV1Interface
9597
networkClient networkv1client.NetworkV1Interface
98+
dynamicClient dynamic.Interface
9699
metricsClient rest.Interface
97100
certClient certificatesv1beta1.CertificatesV1beta1Interface
98101
registryClient imageregistryv1.ImageregistryV1Interface
@@ -103,7 +106,7 @@ type Gatherer struct {
103106

104107
// New creates new Gatherer
105108
func New(client configv1client.ConfigV1Interface, coreClient corev1client.CoreV1Interface, certClient certificatesv1beta1.CertificatesV1beta1Interface, metricsClient rest.Interface,
106-
registryClient imageregistryv1.ImageregistryV1Interface, crdClient apixv1beta1client.ApiextensionsV1beta1Interface, networkClient networkv1client.NetworkV1Interface) *Gatherer {
109+
registryClient imageregistryv1.ImageregistryV1Interface, crdClient apixv1beta1client.ApiextensionsV1beta1Interface, networkClient networkv1client.NetworkV1Interface, dynamicClient dynamic.Interface) *Gatherer {
107110
return &Gatherer{
108111
client: client,
109112
coreClient: coreClient,
@@ -112,6 +115,7 @@ func New(client configv1client.ConfigV1Interface, coreClient corev1client.CoreV1
112115
registryClient: registryClient,
113116
crdClient: crdClient,
114117
networkClient: networkClient,
118+
dynamicClient: dynamicClient,
115119
}
116120
}
117121

@@ -139,6 +143,7 @@ func (i *Gatherer) Gather(ctx context.Context, recorder record.Interface) error
139143
GatherCertificateSigningRequests(i),
140144
GatherCRD(i),
141145
GatherHostSubnet(i),
146+
GatherMachineSet(i),
142147
)
143148
}
144149

@@ -738,6 +743,33 @@ func GatherCRD(i *Gatherer) func() ([]record.Record, []error) {
738743
}
739744
}
740745

746+
//GatherMachineSet collects MachineSet information
747+
//
748+
// The Kubernetes api https://github.com/openshift/machine-api-operator/blob/master/pkg/generated/clientset/versioned/typed/machine/v1beta1/machineset.go
749+
// Response see https://docs.openshift.com/container-platform/4.3/rest_api/index.html#machineset-v1beta1-machine-openshift-io
750+
//
751+
// Location in archive: machinesets/
752+
func GatherMachineSet(i *Gatherer) func() ([]record.Record, []error) {
753+
return func() ([]record.Record, []error) {
754+
gvr := schema.GroupVersionResource{Group: "machine.openshift.io", Version: "v1beta1", Resource: "machinesets"}
755+
machineSets, err := i.dynamicClient.Resource(gvr).List(metav1.ListOptions{})
756+
if errors.IsNotFound(err) {
757+
return nil, nil
758+
}
759+
if err != nil {
760+
return nil, []error{err}
761+
}
762+
records := []record.Record{}
763+
for _, i := range machineSets.Items {
764+
records = append(records, record.Record{
765+
Name: fmt.Sprintf("machinesets/%s", i.GetName()),
766+
Item: record.JSONMarshaller{Object: i.Object},
767+
})
768+
}
769+
return records, nil
770+
}
771+
}
772+
741773
func (i *Gatherer) gatherNamespaceEvents(namespace string) ([]record.Record, []error) {
742774
// do not accidentally collect events for non-openshift namespace
743775
if !strings.HasPrefix(namespace, "openshift-") {

pkg/gather/clusterconfig/clusterconfig_test.go

+40
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ import (
1515
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
1616
apixv1beta1clientfake "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake"
1717
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
18+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1819
"k8s.io/apimachinery/pkg/runtime"
20+
"k8s.io/apimachinery/pkg/runtime/schema"
21+
"k8s.io/apimachinery/pkg/runtime/serializer/yaml"
22+
dynamicfake "k8s.io/client-go/dynamic/fake"
1923
kubefake "k8s.io/client-go/kubernetes/fake"
2024
"k8s.io/klog"
2125

@@ -537,6 +541,42 @@ func TestGatherHostSubnet(t *testing.T) {
537541
}
538542
}
539543

544+
func TestGatherMachineSet(t *testing.T) {
545+
var machineSetYAML = `
546+
apiVersion: machine.openshift.io/v1beta1
547+
kind: MachineSet
548+
metadata:
549+
name: test-worker
550+
`
551+
gvr := schema.GroupVersionResource{Group: "machine.openshift.io", Version: "v1beta1", Resource: "machinesets"}
552+
client := dynamicfake.NewSimpleDynamicClient(runtime.NewScheme())
553+
decUnstructured := yaml.NewDecodingSerializer(unstructured.UnstructuredJSONScheme)
554+
555+
testMachineSet := &unstructured.Unstructured{}
556+
557+
_, _, err := decUnstructured.Decode([]byte(machineSetYAML), nil, testMachineSet)
558+
if err != nil {
559+
t.Fatal("unable to decode machineset ", err)
560+
}
561+
_, err = client.Resource(gvr).Create(testMachineSet, metav1.CreateOptions{})
562+
if err != nil {
563+
t.Fatal("unable to create fake machineset ", err)
564+
}
565+
566+
gatherer := &Gatherer{dynamicClient: client}
567+
records, errs := GatherMachineSet(gatherer)()
568+
if len(errs) > 0 {
569+
t.Errorf("unexpected errors: %#v", errs)
570+
return
571+
}
572+
if len(records) != 1 {
573+
t.Fatalf("unexpected number or records %d", len(records))
574+
}
575+
if records[0].Name != "machinesets/test-worker" {
576+
t.Fatalf("unexpected machineset name %s", records[0].Name)
577+
}
578+
}
579+
540580
func ExampleGatherMostRecentMetrics_Test() {
541581
b, err := ExampleMostRecentMetrics()
542582
if err != nil {

vendor/k8s.io/apimachinery/pkg/runtime/serializer/yaml/yaml.go

+46
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)