// Copyright © 2019 The Knative Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package dynamic import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/dynamic" ) const ( crdGroup = "apiextensions.k8s.io" crdVersion = "v1beta1" crdKind = "CustomResourceDefinition" crdKinds = "customresourcedefinitions" sourcesLabelKey = "duck.knative.dev/source" sourcesLabelValue = "true" ) // KnDynamicClient to client-go Dynamic client. All methods are relative to the // namespace specified during construction type KnDynamicClient interface { // Namespace in which this client is operating for Namespace() string // ListCRDs returns list of CRDs with their type and name ListCRDs(options metav1.ListOptions) (*unstructured.UnstructuredList, error) // ListSourceCRDs returns list of eventing sources CRDs ListSourcesTypes() (*unstructured.UnstructuredList, error) } // knDynamicClient is a combination of client-go Dynamic client interface and namespace type knDynamicClient struct { client dynamic.Interface namespace string } // NewKnDynamicClient is to invoke Eventing Sources Client API to create object func NewKnDynamicClient(client dynamic.Interface, namespace string) KnDynamicClient { return &knDynamicClient{ client: client, namespace: namespace, } } // Return the client's namespace func (c *knDynamicClient) Namespace() string { return c.namespace } // TODO(navidshaikh): Use ListConfigs here instead of ListOptions // ListCRDs returns list of installed CRDs in the cluster and filters based on the given options func (c *knDynamicClient) ListCRDs(options metav1.ListOptions) (*unstructured.UnstructuredList, error) { gvr := schema.GroupVersionResource{ Group: crdGroup, Version: crdVersion, Resource: crdKinds, } uList, err := c.client.Resource(gvr).List(options) if err != nil { return nil, err } return uList, nil } // ListSourcesTypes returns installed knative eventing sources CRDs func (c *knDynamicClient) ListSourcesTypes() (*unstructured.UnstructuredList, error) { options := metav1.ListOptions{} sourcesLabels := labels.Set{sourcesLabelKey: sourcesLabelValue} options.LabelSelector = sourcesLabels.String() return c.ListCRDs(options) }