resource.go 5.5 KB
Newer Older
H
hongming 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
 *
 * Copyright 2020 The KubeSphere 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.
 * /
 */

Z
zryfish 已提交
19 20 21 22
package resource

import (
	"errors"
Z
zhangmin 已提交
23
	snapshotv1beta1 "github.com/kubernetes-csi/external-snapshotter/v2/pkg/apis/volumesnapshot/v1beta1"
H
hongming 已提交
24 25
	rbacv1 "k8s.io/api/rbac/v1"
	"k8s.io/apimachinery/pkg/runtime"
Z
zryfish 已提交
26 27
	"k8s.io/apimachinery/pkg/runtime/schema"
	"kubesphere.io/kubesphere/pkg/api"
H
hongming 已提交
28 29
	iamv1alpha2 "kubesphere.io/kubesphere/pkg/apis/iam/v1alpha2"
	tenantv1alpha1 "kubesphere.io/kubesphere/pkg/apis/tenant/v1alpha1"
Z
zryfish 已提交
30
	"kubesphere.io/kubesphere/pkg/apiserver/query"
Z
zryfish 已提交
31
	"kubesphere.io/kubesphere/pkg/informers"
Z
zryfish 已提交
32
	"kubesphere.io/kubesphere/pkg/models/resources/v1alpha3"
H
hongming 已提交
33
	"kubesphere.io/kubesphere/pkg/models/resources/v1alpha3/application"
34
	"kubesphere.io/kubesphere/pkg/models/resources/v1alpha3/cluster"
H
hongming 已提交
35 36
	"kubesphere.io/kubesphere/pkg/models/resources/v1alpha3/clusterrole"
	"kubesphere.io/kubesphere/pkg/models/resources/v1alpha3/configmap"
37
	"kubesphere.io/kubesphere/pkg/models/resources/v1alpha3/customresourcedefinition"
Z
zryfish 已提交
38
	"kubesphere.io/kubesphere/pkg/models/resources/v1alpha3/deployment"
H
hongming 已提交
39
	"kubesphere.io/kubesphere/pkg/models/resources/v1alpha3/globalrole"
H
hongming 已提交
40
	"kubesphere.io/kubesphere/pkg/models/resources/v1alpha3/namespace"
D
Duan Jiong 已提交
41
	"kubesphere.io/kubesphere/pkg/models/resources/v1alpha3/networkpolicy"
H
hongming 已提交
42 43 44
	"kubesphere.io/kubesphere/pkg/models/resources/v1alpha3/pod"
	"kubesphere.io/kubesphere/pkg/models/resources/v1alpha3/role"
	"kubesphere.io/kubesphere/pkg/models/resources/v1alpha3/user"
Z
zhangmin 已提交
45
	"kubesphere.io/kubesphere/pkg/models/resources/v1alpha3/volumesnapshot"
H
hongming 已提交
46 47
	"kubesphere.io/kubesphere/pkg/models/resources/v1alpha3/workspace"
	"kubesphere.io/kubesphere/pkg/models/resources/v1alpha3/workspacerole"
Z
zryfish 已提交
48 49 50 51
)

var ErrResourceNotSupported = errors.New("resource is not supported")

H
hongming 已提交
52
type ResourceGetter struct {
Z
zryfish 已提交
53 54 55
	getters map[schema.GroupVersionResource]v1alpha3.Interface
}

H
hongming 已提交
56
func NewResourceGetter(factory informers.InformerFactory) *ResourceGetter {
Z
zryfish 已提交
57 58
	getters := make(map[schema.GroupVersionResource]v1alpha3.Interface)

Z
zryfish 已提交
59
	getters[schema.GroupVersionResource{Group: "apps", Version: "v1", Resource: "deployments"}] = deployment.New(factory.KubernetesSharedInformerFactory())
H
hongming 已提交
60
	getters[schema.GroupVersionResource{Group: "", Version: "v1", Resource: "namespaces"}] = namespace.New(factory.KubernetesSharedInformerFactory())
H
hongming 已提交
61 62
	getters[schema.GroupVersionResource{Group: "", Version: "v1", Resource: "configmaps"}] = configmap.New(factory.KubernetesSharedInformerFactory())
	getters[schema.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"}] = pod.New(factory.KubernetesSharedInformerFactory())
H
hongming 已提交
63
	getters[schema.GroupVersionResource{Group: "app.k8s.io", Version: "v1beta1", Resource: "applications"}] = application.New(factory.ApplicationSharedInformerFactory())
D
Duan Jiong 已提交
64
	getters[schema.GroupVersionResource{Group: "networking.k8s.io", Version: "v1", Resource: "networkpolicies"}] = networkpolicy.New(factory.KubernetesSharedInformerFactory())
H
hongming 已提交
65 66 67 68 69 70
	getters[tenantv1alpha1.SchemeGroupVersion.WithResource(tenantv1alpha1.ResourcePluralWorkspace)] = workspace.New(factory.KubeSphereSharedInformerFactory())
	getters[iamv1alpha2.SchemeGroupVersion.WithResource(iamv1alpha2.ResourcesPluralGlobalRole)] = globalrole.New(factory.KubeSphereSharedInformerFactory())
	getters[iamv1alpha2.SchemeGroupVersion.WithResource(iamv1alpha2.ResourcesPluralWorkspaceRole)] = workspacerole.New(factory.KubeSphereSharedInformerFactory())
	getters[iamv1alpha2.SchemeGroupVersion.WithResource(iamv1alpha2.ResourcesPluralUser)] = user.New(factory.KubeSphereSharedInformerFactory())
	getters[rbacv1.SchemeGroupVersion.WithResource("roles")] = role.New(factory.KubernetesSharedInformerFactory())
	getters[rbacv1.SchemeGroupVersion.WithResource("clusterroles")] = clusterrole.New(factory.KubernetesSharedInformerFactory())
Z
zhangmin 已提交
71
	getters[snapshotv1beta1.SchemeGroupVersion.WithResource("volumesnapshots")] = volumesnapshot.New(factory.SnapshotSharedInformerFactory())
72 73
	getters[schema.GroupVersionResource{Group: "cluster.kubesphere.io", Version: "v1alpha1", Resource: "clusters"}] = cluster.New(factory.KubeSphereSharedInformerFactory())
	getters[schema.GroupVersionResource{Group: "apiextensions.k8s.io", Version: "v1", Resource: "customresourcedefinitions"}] = customresourcedefinition.New(factory.ApiExtensionSharedInformerFactory())
H
hongming 已提交
74
	return &ResourceGetter{
Z
zryfish 已提交
75 76 77 78 79 80
		getters: getters,
	}
}

// tryResource will retrieve a getter with resource name, it doesn't guarantee find resource with correct group version
// need to refactor this use schema.GroupVersionResource
H
hongming 已提交
81
func (r *ResourceGetter) tryResource(resource string) v1alpha3.Interface {
Z
zryfish 已提交
82 83 84 85 86 87 88 89
	for k, v := range r.getters {
		if k.Resource == resource {
			return v
		}
	}
	return nil
}

H
hongming 已提交
90
func (r *ResourceGetter) Get(resource, namespace, name string) (runtime.Object, error) {
Z
zryfish 已提交
91 92 93 94 95 96 97
	getter := r.tryResource(resource)
	if getter == nil {
		return nil, ErrResourceNotSupported
	}
	return getter.Get(namespace, name)
}

H
hongming 已提交
98
func (r *ResourceGetter) List(resource, namespace string, query *query.Query) (*api.ListResult, error) {
Z
zryfish 已提交
99 100 101 102
	getter := r.tryResource(resource)
	if getter == nil {
		return nil, ErrResourceNotSupported
	}
Z
zryfish 已提交
103
	return getter.List(namespace, query)
Z
zryfish 已提交
104
}