102 lines
3.4 KiB
Go
102 lines
3.4 KiB
Go
/*
|
||
* Copyright 2024 the KubeSphere Authors.
|
||
* Please refer to the LICENSE file in the root directory of the project.
|
||
* https://github.com/kubesphere/kubesphere/blob/master/LICENSE
|
||
*/
|
||
|
||
package main
|
||
|
||
import (
|
||
"flag"
|
||
"log"
|
||
"os"
|
||
"path/filepath"
|
||
|
||
"k8s.io/apimachinery/pkg/api/meta"
|
||
"k8s.io/apimachinery/pkg/runtime"
|
||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||
"k8s.io/apimachinery/pkg/runtime/serializer"
|
||
urlruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||
"k8s.io/kube-openapi/pkg/common"
|
||
kubespec "k8s.io/kube-openapi/pkg/validation/spec"
|
||
clusterv1alpha1 "kubesphere.io/api/cluster/v1alpha1"
|
||
tenantv1beta1 "kubesphere.io/api/tenant/v1beta1"
|
||
|
||
"kubesphere.io/kubesphere/pkg/version"
|
||
"kubesphere.io/kubesphere/tools/lib"
|
||
)
|
||
|
||
var output string
|
||
|
||
func init() {
|
||
flag.StringVar(&output, "output", "./api/openapi-spec/swagger.json", "--output=./api/openapi-spec/swagger.json")
|
||
}
|
||
|
||
func main() {
|
||
|
||
var (
|
||
Scheme = runtime.NewScheme()
|
||
Codecs = serializer.NewCodecFactory(Scheme)
|
||
)
|
||
|
||
urlruntime.Must(clusterv1alpha1.AddToScheme(Scheme))
|
||
urlruntime.Must(tenantv1beta1.AddToScheme(Scheme))
|
||
urlruntime.Must(Scheme.SetVersionPriority(clusterv1alpha1.SchemeGroupVersion))
|
||
|
||
mapper := meta.NewDefaultRESTMapper(nil)
|
||
|
||
mapper.AddSpecific(tenantv1beta1.SchemeGroupVersion.WithKind(tenantv1beta1.ResourceKindWorkspace),
|
||
tenantv1beta1.SchemeGroupVersion.WithResource(tenantv1beta1.ResourcePluralWorkspace),
|
||
tenantv1beta1.SchemeGroupVersion.WithResource(tenantv1beta1.ResourceSingularWorkspace), meta.RESTScopeRoot)
|
||
|
||
mapper.AddSpecific(clusterv1alpha1.SchemeGroupVersion.WithKind(clusterv1alpha1.ResourceKindCluster),
|
||
clusterv1alpha1.SchemeGroupVersion.WithResource(clusterv1alpha1.ResourcesPluralCluster),
|
||
clusterv1alpha1.SchemeGroupVersion.WithResource(clusterv1alpha1.ResourcesSingularCluster), meta.RESTScopeRoot)
|
||
|
||
mapper.AddSpecific(clusterv1alpha1.SchemeGroupVersion.WithKind(clusterv1alpha1.ResourceKindCluster),
|
||
clusterv1alpha1.SchemeGroupVersion.WithResource(clusterv1alpha1.ResourcesPluralCluster),
|
||
clusterv1alpha1.SchemeGroupVersion.WithResource(clusterv1alpha1.ResourcesSingularCluster), meta.RESTScopeRoot)
|
||
|
||
spec, err := lib.RenderOpenAPISpec(lib.Config{
|
||
Scheme: Scheme,
|
||
Codecs: Codecs,
|
||
Info: kubespec.InfoProps{
|
||
Title: "KubeSphere",
|
||
Version: version.Get().GitVersion,
|
||
Contact: &kubespec.ContactInfo{
|
||
Name: "KubeSphere",
|
||
URL: "https://kubesphere.io/",
|
||
Email: "kubesphere@yunify.com",
|
||
},
|
||
License: &kubespec.License{
|
||
Name: "Apache 2.0",
|
||
URL: "https://www.apache.org/licenses/LICENSE-2.0.html",
|
||
},
|
||
},
|
||
OpenAPIDefinitions: []common.GetOpenAPIDefinitions{
|
||
tenantv1beta1.GetOpenAPIDefinitions,
|
||
clusterv1alpha1.GetOpenAPIDefinitions,
|
||
},
|
||
Resources: []schema.GroupVersionResource{
|
||
//TODO(runzexia) At present, the document generation requires the openapi structure of the go language,
|
||
// but there is no +k8s:openapi-gen=true in the repository of https://github.com/knative/pkg,
|
||
// and the api document cannot be generated temporarily.
|
||
tenantv1beta1.SchemeGroupVersion.WithResource(tenantv1beta1.ResourcePluralWorkspace),
|
||
clusterv1alpha1.SchemeGroupVersion.WithResource(clusterv1alpha1.ResourcesPluralCluster),
|
||
},
|
||
Mapper: mapper,
|
||
})
|
||
if err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
|
||
err = os.MkdirAll(filepath.Dir(output), 0755)
|
||
if err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
err = os.WriteFile(output, []byte(spec), 0644)
|
||
if err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
}
|