4000 docker k8s二次开发(一) 注册自定义api
2017-10-18 10:04
691 查看
package main import ( "fmt" "math/rand" "os" "time" "wdcp-build/apiserver/app" "wdcp-build/apiserver/options" "github.com/spf13/pflag" "k8s.io/apiserver/pkg/util/flag" "k8s.io/kubernetes/pkg/util/logs" ) func main() { rand.Seed(time.Now().UTC().UnixNano()) s := options.NewServerRunOptions() s.AddFlags(pflag.CommandLine) flag.InitFlags() logs.InitLogs() defer logs.FlushLogs() // verflag.PrintAndExitIfRequested() if err := app.Run(s); err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) } }
package app import ( "wdcp-build/apiserver/options" "wdcp-build/pkg/master" ) func Run(s *options.ServerRunOptions) error { // glog.Info("config-file>>>%s", s.ConfigFile) // glog.Info("pkg-mac>>>>%s", s.PackageMac) // glog.Info("docker-endpoints>>>%s", s.DockerEndpoints) // client, err := s.NewSelfClient() // if err != nil { // glog.Errorf("Failed to create clientset: %v", err) // } // sharedInformers := informers.NewSharedInformerFactory(client, 10*time.Minute) config := &master.Config{ ServerRunConfig: s, } m, err := master.New(config) if err != nil { return err } // sharedInformers.Start(wait.NeverStop) m.Run(s) return nil }
package master import ( "fmt" "log" "net/http" "wdcp-build/apiserver/options" "wdcp-build/pkg/apiserver" "wdcp-build/pkg/util" "github.com/emicklei/go-restful" "github.com/golang/glog" ) type Master struct { HandlerContainer *restful.Container } type Config struct { ServerRunConfig *options.ServerRunOptions } func New(c *Config) (*Master, error) { isExist, err := util.PathExists(c.ServerRunConfig.ConfigFile) if !isExist { return nil, err } util.RunOption, err = util.ReadFile(c.ServerRunConfig.ConfigFile) if err != nil { return nil, err } // glog.Info("RunOptions>>>>>%s", util.RunOption) container := restful.NewContainer() m := &Master{ HandlerContainer: container, } m.InstallAPIs(c) return m, nil } func (s *Master) Run(options *options.ServerRunOptions) { addr := fmt.Sprintf(":%d", util.RunOption.InsecurePort) http := &http.Server{ Addr: addr, Handler: s.HandlerContainer, MaxHeaderBytes: 1 << 20, } log.Fatal(http.ListenAndServe()) } func (m *Master) InstallAPIs(c *Config) { for _, installer := range apiserver.APIInstallerList { if err := installer.InstallREST(m.HandlerContainer, c.ServerRunConfig); err != nil { glog.Error("%v", err) } } }
package master import ( "fmt" "log" "net/http" "wdcp-build/apiserver/options" "wdcp-build/pkg/apiserver" "wdcp-build/pkg/util" "github.com/emicklei/go-restful" "github.com/golang/glog" ) type Master struct { HandlerContainer *restful.Container } type Config struct { ServerRunConfig *options.ServerRunOptions } func New(c *Config) (*Master, error) { isExist, err := util.PathExists(c.ServerRunConfig.ConfigFile) if !isExist { return nil, err } util.RunOption, err = util.ReadFile(c.ServerRunConfig.ConfigFile) if err != nil { return nil, err } // glog.Info("RunOptions>>>>>%s", util.RunOption) container := restful.NewContainer() m := &Master{ HandlerContainer: container, } m.InstallAPIs(c) return m, nil } func (s *Master) Run(options *options.ServerRunOptions) { addr := fmt.Sprintf(":%d", util.RunOption.InsecurePort) http := &http.Server{ Addr: addr, Handler: s.HandlerContainer, MaxHeaderBytes: 1 << 20, } log.Fatal(http.ListenAndServe()) } func (m *Master) InstallAPIs(c *Config) { for _, installer := range apiserver.APIInstallerList { if err := installer.InstallREST(m.HandlerContainer, c.ServerRunConfig); err != nil { glog.Error("%v", err) } } }
package apiserver import ( "fmt" "time" "wdcp-build/apiserver/options" "wdcp-build/pkg/api/unversioned" restful "github.com/emicklei/go-restful" ) type APIInstaller struct { groupVersion string prefix string apiMappings []ApiMapping minRequestTimeout time.Duration serverRunConfig *options.ServerRunOptions } type ApiMapping struct { path string verb string apiHandler restful.RouteFunction } // NewWebService creates a new restful webservice with the api installer's prefix and version. func (a *APIInstaller) NewWebService() *restful.WebService { ws := new(restful.WebService) wsPath := a.groupVersion + a.prefix fmt.Println(wsPath) ws.Path(wsPath) ws.Doc("API at " + wsPath) ws.Consumes(restful.MIME_JSON) ws.Produces(restful.MIME_JSON) return ws } // Installs handlers for API resources. func (a *APIInstaller) Install(ws *restful.WebService) (apiResources []unversioned.APIResource, errors []error) { errors = make([]error, 0) apiResource, err := a.registerResourceHandlers(ws) if apiResource != nil { apiResources = append(apiResources, *apiResource) } if err != nil { errors = append(errors, fmt.Errorf("error in registering resource: %s, %v", a.prefix, err)) } return apiResources, errors } func (a *APIInstaller) registerResourceHandlers(ws *restful.WebService) (*unversioned.APIResource, error) { var apiResource unversioned.APIResource var router *restful.RouteBuilder for _, apiMap := range a.apiMappings { // fmt.Println(apiMap.verb) // fmt.Println(apiMap.path) // fmt.Println(apiMap.apiHandler) switch apiMap.verb { case unversioned.VERB_POST: router = ws.POST(apiMap.path).To(apiMap.apiHandler) ws.Route(router) case unversioned.VERB_GET: router = ws.GET(apiMap.path).To(apiMap.apiHandler) ws.Route(router) case unversioned.VERB_PUT: router = ws.PUT(apiMap.path).To(apiMap.apiHandler) ws.Route(router) case unversioned.VERB_DELETE: router = ws.DELETE(apiMap.path).To(apiMap.apiHandler) ws.Route(router) } } return &apiResource, nil }
package apiserver import ( "wdcp-build/apiserver/options" "wdcp-build/pkg/buildengine" "wdcp-build/pkg/k8sengine" "wdcp-build/pkg/task" restful "github.com/emicklei/go-restful" utilerrors "k8s.io/apimachinery/pkg/util/errors" ) var APIInstallerList = []APIInstaller{ { groupVersion: "/v1", prefix: "/test", apiMappings: []ApiMapping{ { path: "/{user-id}", verb: "GET", apiHandler: buildimage.TestHandler, }, }, }, { groupVersion: "/v1", prefix: "/code/branch", apiMappings: []ApiMapping{ { path: "", verb: "POST", apiHandler: buildimage.BranchHandler, }, }, }, { groupVersion: "/v1", prefix: "/code/version", apiMappings: []ApiMapping{ { path: "/{project_name}/{branch}/{task_event_uuid}", verb: "GET", apiHandler: buildimage.CodeVersionHandler, }, }, }, { groupVersion: "/v1", prefix: "/build", apiMappings: []ApiMapping{ { path: "", verb: "POST", apiHandler: buildimage.BuildHandler, }, }, }, { groupVersion: "/v1", prefix: "/task", apiMappings: []ApiMapping{ { path: "/{task_event_uuid}", verb: "GET", apiHandler: task.TaskHandler, }, }, }, { groupVersion: "/v1", prefix: "/app", apiMappings: []ApiMapping{ { path: "", verb: "POST", apiHandler: k8sengine.CreateK8sHandler, }, { path: "", verb: "DELETE", apiHandler: k8sengine.DeleteHandler, }, { path: "", verb: "PUT", apiHandler: k8sengine.UpdateK8sHandler, }, { path: "/deployment/{cluster_level}/{tenant}/{project_name}", verb: "GET", apiHandler: k8sengine.GetDeploymentHandler, }, { path: "/statefulset/{cluster_level}/{tenant}/{project_name}", verb: "GET", apiHandler: k8sengine.GetStatefulSetHandler, }, }, }, { groupVersion: "/v1", prefix: "/ns", apiMappings: []ApiMapping{ { path: "", verb: "POST", apiHandler: k8sengine.CreateNsHandler, }, { path: "/{cluster_level}/{namespace}", verb: "GET", apiHandler: k8sengine.GetNamespaceHandler, }, }, }, { groupVersion: "/v1", prefix: "/vaddr", apiMappings: []ApiMapping{ { path: "/{cluster_level}/{tenant}/{project_name}", verb: "GET", apiHandler: k8sengine.GetVisitAddrHandler, }, }, }, { groupVersion: "/v1", prefix: "/pod", apiMappings: []ApiMapping{ { path: "/{cluster_level}/{tenant}/{project_name}", verb: "GET", apiHandler: k8sengine.GetPodStatusHandler, }, { path: "/log/{cluster_level}/{tenant}/{project_name}/{pod_name}", verb: "GET", apiHandler: k8sengine.GetPodLogHandler, }, }, }, { groupVersion: "/v1", prefix: "/pods", apiMappings: []ApiMapping{ { path: "", verb: "POST", apiHandler: k8sengine.ListPodsStatusHandler, }, }, }, { groupVersion: "/v1", prefix: "/scale", apiMappings: []ApiMapping{ { path: "", verb: "POST", apiHandler: k8sengine.ScaleK8sHandler, }, }, }, { groupVersion: "/v1", prefix: "/list", apiMappings: []ApiMapping{ { path: "/ns/{cluster_level}/{tenant}", verb: "GET", apiHandler: k8sengine.ListResNamespaceHandler, }, { path: "/node/{cluster_level}/{tenant}", verb: "GET", apiHandler: k8sengine.ListResNodeHandler, }, { path: "/deployment/{cluster_level}/{tenant}", verb: "GET", apiHandler: k8sengine.ListResDeploymentHandler, }, { path: "/statefulset/{cluster_level}/{tenant}", verb: "GET", apiHandler: k8sengine.ListResStatefulSetHandler, }, { path: "/service/{cluster_level}/{tenant}", verb: "GET", apiHandler: k8sengine.ListResServiceHandler, }, { path: "/pod/{cluster_level}/{tenant}", verb: "GET", apiHandler: k8sengine.ListResPodHandler, }, }, }, } func (installer *APIInstaller) InstallREST(container *restful.Container, c *options.ServerRunOptions) error { ws := installer.NewWebService() _, registrationErrors := installer.Install(ws) container.Add(ws) return utilerrors.NewAggregate(registrationErrors) }
相关文章推荐
- docker k8s二次开发(二)api的实现
- (12)自定义数据流(实战Docker事件推送的REST API)——响应式Spring的道法术器
- 【原创】k8s源码分析-----kubelet(2)dockerClient
- Docker 生产环境之配置对象 - 配置对象使用自定义元数据
- 4000 2.docker常用命令
- jenkins token-macro 导致docker API连接 Test失败
- mina仿qq聊天功能,自定义协议,协议的编码和解码详解,发送xml对象json,mina开发大全,详细api,mina心跳
- Docker dubbo 服务注册
- CentOS7.3下Docker自定义镜像
- 使用 jQuery Mobile API 实现细粒度的自定义控制
- [k8s]通过svc来访问集群podhttp://api:8080/api/v1/namespaces/default/services/mynginx/proxy/
- docker深入2-UI之portainer通过API来更新service的ACL
- k8s 如何 Failover?- 每天5分钟玩转 Docker 容器技术(127)
- [置顶] Android自定义方框EditText注册验证码
- 发布PL/SQL API成Webservice,并注册到IR(Oracle Integration Repositoy)中
- 分享一下 Centos7 打开Docker 远程 API 的 配置
- 本地调用远程docker;设置dockerAPI
- Spring自定义属性编辑器PropertyEditorSupport + 使用CustomEditorConfigurer注册属性编辑器
- Google 输入法api自定义体验
- ArcGIS JS 版军事标绘图(燕尾箭头、钳击箭头、集结地)扇形等自定义图形, ArcGIS For JavaScript API Drawing Tool(绘图工具)————(十七)