mirror of
https://gitee.com/rainbond/Rainbond.git
synced 2024-12-03 20:27:46 +08:00
311 lines
17 KiB
Go
311 lines
17 KiB
Go
// Copyright (C) 2014-2018 Goodrain Co., Ltd.
|
|
// RAINBOND, Application Management Platform
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version. For any non-GPL usage of Rainbond,
|
|
// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd.
|
|
// must be obtained first.
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
package version2
|
|
|
|
import (
|
|
"github.com/go-chi/chi"
|
|
"github.com/goodrain/rainbond/api/controller"
|
|
"github.com/goodrain/rainbond/api/middleware"
|
|
"github.com/goodrain/rainbond/cmd/api/option"
|
|
dbmodel "github.com/goodrain/rainbond/db/model"
|
|
)
|
|
|
|
//V2 v2
|
|
type V2 struct {
|
|
Cfg *option.Config
|
|
}
|
|
|
|
//Routes routes
|
|
func (v2 *V2) Routes() chi.Router {
|
|
r := chi.NewRouter()
|
|
license := middleware.NewLicense(v2.Cfg)
|
|
r.Use(license.Verify)
|
|
r.Get("/show", controller.GetManager().Show)
|
|
r.Post("/show", controller.GetManager().Show)
|
|
r.Mount("/tenants", v2.tenantRouter())
|
|
r.Mount("/notificationEvent", v2.notificationEventRouter())
|
|
r.Mount("/resources", v2.resourcesRouter())
|
|
r.Mount("/prometheus", v2.prometheusRouter())
|
|
r.Get("/event", controller.GetManager().Event)
|
|
r.Mount("/app", v2.appRouter())
|
|
r.Get("/health", controller.GetManager().Health)
|
|
r.Post("/alertmanager-webhook", controller.GetManager().AlertManagerWebHook)
|
|
r.Get("/version", controller.GetManager().Version)
|
|
// deprecated use /gateway/ports
|
|
r.Mount("/port", v2.portRouter())
|
|
// deprecated, use /events/<event_id>/log
|
|
r.Get("/event-log", controller.GetManager().LogByAction)
|
|
r.Mount("/events", v2.eventsRouter())
|
|
r.Get("/gateway/ips", controller.GetGatewayIPs)
|
|
r.Get("/gateway/ports", controller.GetManager().GetAvailablePort)
|
|
return r
|
|
}
|
|
|
|
func (v2 *V2) eventsRouter() chi.Router {
|
|
r := chi.NewRouter()
|
|
// get target's event list with page
|
|
r.Get("/", controller.GetManager().Events)
|
|
// get target's event content
|
|
r.Get("/{eventID}/log", controller.GetManager().EventLog)
|
|
return r
|
|
}
|
|
|
|
func (v2 *V2) tenantRouter() chi.Router {
|
|
r := chi.NewRouter()
|
|
r.Post("/", controller.GetManager().Tenants)
|
|
r.Mount("/{tenant_name}", v2.tenantNameRouter())
|
|
r.Get("/", controller.GetManager().Tenants)
|
|
r.Get("/services-count", controller.GetManager().ServicesCount)
|
|
return r
|
|
}
|
|
|
|
func (v2 *V2) tenantNameRouter() chi.Router {
|
|
r := chi.NewRouter()
|
|
//初始化租户和服务信
|
|
r.Use(middleware.InitTenant)
|
|
r.Put("/", controller.GetManager().Tenant)
|
|
r.Get("/", controller.GetManager().Tenant)
|
|
r.Delete("/", controller.GetManager().Tenant)
|
|
//租户中的日志
|
|
r.Post("/event-log", controller.GetManager().TenantLogByAction)
|
|
r.Get("/protocols", controller.GetManager().GetSupportProtocols)
|
|
//插件预安装
|
|
r.Post("/transplugins", controller.GetManager().TransPlugins)
|
|
//代码检测
|
|
r.Post("/code-check", controller.GetManager().CheckCode)
|
|
r.Post("/servicecheck", controller.Check)
|
|
r.Get("/servicecheck/{uuid}", controller.GetServiceCheckInfo)
|
|
r.Get("/resources", controller.GetManager().SingleTenantResources)
|
|
r.Get("/services", controller.GetManager().ServicesInfo)
|
|
//创建应用
|
|
r.Post("/services", middleware.WrapEL(controller.GetManager().CreateService, dbmodel.TargetTypeService, "create-service", dbmodel.SYNEVENTTYPE))
|
|
r.Post("/plugin", controller.GetManager().PluginAction)
|
|
r.Post("/plugins/{plugin_id}/share", controller.GetManager().SharePlugin)
|
|
r.Get("/plugins/{plugin_id}/share/{share_id}", controller.GetManager().SharePluginResult)
|
|
r.Get("/plugin", controller.GetManager().PluginAction)
|
|
r.Post("/services_status", controller.GetManager().StatusServiceList)
|
|
r.Mount("/services/{service_alias}", v2.serviceRouter())
|
|
r.Mount("/plugin/{plugin_id}", v2.pluginRouter())
|
|
r.Get("/event", controller.GetManager().Event)
|
|
r.Get("/chargesverify", controller.ChargesVerifyController)
|
|
//get some service pod info
|
|
r.Get("/pods", controller.Pods)
|
|
//app backup
|
|
r.Get("/groupapp/backups", controller.Backups)
|
|
r.Post("/groupapp/backups", controller.NewBackups)
|
|
r.Post("/groupapp/backupcopy", controller.BackupCopy)
|
|
r.Get("/groupapp/backups/{backup_id}", controller.GetBackup)
|
|
r.Delete("/groupapp/backups/{backup_id}", controller.DeleteBackup)
|
|
r.Post("/groupapp/backups/{backup_id}/restore", controller.Restore)
|
|
r.Get("/groupapp/backups/{backup_id}/restore/{restore_id}", controller.RestoreResult)
|
|
r.Post("/deployversions", controller.GetManager().GetManyDeployVersion)
|
|
//团队资源限制
|
|
r.Post("/limit_memory", controller.GetManager().LimitTenantMemory)
|
|
r.Get("/limit_memory", controller.GetManager().TenantResourcesStatus)
|
|
|
|
// Gateway
|
|
r.Post("/http-rule", controller.GetManager().HTTPRule)
|
|
r.Delete("/http-rule", controller.GetManager().HTTPRule)
|
|
r.Put("/http-rule", controller.GetManager().HTTPRule)
|
|
r.Post("/tcp-rule", controller.GetManager().TCPRule)
|
|
r.Delete("/tcp-rule", controller.GetManager().TCPRule)
|
|
r.Put("/tcp-rule", controller.GetManager().TCPRule)
|
|
r.Mount("/gateway", v2.gatewayRouter())
|
|
|
|
//batch operation
|
|
r.Post("/batchoperation", controller.BatchOperation)
|
|
|
|
return r
|
|
}
|
|
|
|
func (v2 *V2) gatewayRouter() chi.Router {
|
|
r := chi.NewRouter()
|
|
r.Put("/certificate", controller.GetManager().Certificate)
|
|
|
|
return r
|
|
}
|
|
|
|
func (v2 *V2) serviceRouter() chi.Router {
|
|
r := chi.NewRouter()
|
|
//初始化应用信息
|
|
r.Use(middleware.InitService)
|
|
r.Put("/", middleware.WrapEL(controller.GetManager().UpdateService, dbmodel.TargetTypeService, "update-service", dbmodel.SYNEVENTTYPE))
|
|
//应用构建(act)
|
|
r.Post("/build", middleware.WrapEL(controller.GetManager().BuildService, dbmodel.TargetTypeService, "build-service", dbmodel.ASYNEVENTTYPE))
|
|
//应用起停
|
|
r.Post("/start", middleware.WrapEL(controller.GetManager().StartService, dbmodel.TargetTypeService, "start-service", dbmodel.ASYNEVENTTYPE))
|
|
r.Post("/stop", middleware.WrapEL(controller.GetManager().StopService, dbmodel.TargetTypeService, "stop-service", dbmodel.ASYNEVENTTYPE))
|
|
r.Post("/restart", middleware.WrapEL(controller.GetManager().RestartService, dbmodel.TargetTypeService, "restart-service", dbmodel.ASYNEVENTTYPE))
|
|
//应用伸缩
|
|
r.Put("/vertical", middleware.WrapEL(controller.GetManager().VerticalService, dbmodel.TargetTypeService, "vertical-service", dbmodel.ASYNEVENTTYPE))
|
|
r.Put("/horizontal", middleware.WrapEL(controller.GetManager().HorizontalService, dbmodel.TargetTypeService, "horizontal-service", dbmodel.ASYNEVENTTYPE))
|
|
//设置应用语言(act)
|
|
r.Post("/language", middleware.WrapEL(controller.GetManager().SetLanguage, dbmodel.TargetTypeService, "set-language", dbmodel.SYNEVENTTYPE))
|
|
//应用信息获取修改与删除(source)
|
|
r.Get("/", controller.GetManager().SingleServiceInfo)
|
|
r.Delete("/", middleware.WrapEL(controller.GetManager().SingleServiceInfo, dbmodel.TargetTypeService, "delete-service", dbmodel.SYNEVENTTYPE))
|
|
//应用升级(act)
|
|
r.Post("/upgrade", middleware.WrapEL(controller.GetManager().UpgradeService, dbmodel.TargetTypeService, "upgrade-service", dbmodel.ASYNEVENTTYPE))
|
|
//应用状态获取(act)
|
|
r.Get("/status", controller.GetManager().StatusService)
|
|
//构建版本列表
|
|
r.Get("/build-list", controller.GetManager().BuildList)
|
|
//构建版本操作
|
|
r.Get("/build-version/{build_version}", controller.GetManager().BuildVersionInfo)
|
|
r.Get("/deployversion", controller.GetManager().GetDeployVersion)
|
|
r.Delete("/build-version/{build_version}", middleware.WrapEL(controller.GetManager().BuildVersionInfo, dbmodel.TargetTypeService, "delete-buildversion", dbmodel.SYNEVENTTYPE))
|
|
//应用分享
|
|
r.Post("/share", middleware.WrapEL(controller.GetManager().Share, dbmodel.TargetTypeService, "share-service", dbmodel.ASYNEVENTTYPE))
|
|
r.Get("/share/{share_id}", controller.GetManager().ShareResult)
|
|
r.Get("/logs", controller.GetManager().HistoryLogs)
|
|
r.Get("/log-file", controller.GetManager().LogList)
|
|
r.Get("/log-instance", controller.GetManager().LogSocket)
|
|
r.Post("/event-log", controller.GetManager().LogByAction)
|
|
|
|
//应用依赖关系增加与删除(source)
|
|
r.Post("/dependency", middleware.WrapEL(controller.GetManager().Dependency, dbmodel.TargetTypeService, "add-service-dependency", dbmodel.SYNEVENTTYPE))
|
|
r.Delete("/dependency", middleware.WrapEL(controller.GetManager().Dependency, dbmodel.TargetTypeService, "delete-service-dependency", dbmodel.SYNEVENTTYPE))
|
|
//环境变量增删改(source)
|
|
r.Post("/env", middleware.WrapEL(controller.GetManager().Env, dbmodel.TargetTypeService, "add-service-env", dbmodel.SYNEVENTTYPE))
|
|
r.Put("/env", middleware.WrapEL(controller.GetManager().Env, dbmodel.TargetTypeService, "update-service-env", dbmodel.SYNEVENTTYPE))
|
|
r.Delete("/env", middleware.WrapEL(controller.GetManager().Env, dbmodel.TargetTypeService, "delete-service-env", dbmodel.SYNEVENTTYPE))
|
|
//端口变量增删改(source)
|
|
r.Post("/ports", middleware.WrapEL(controller.GetManager().Ports, dbmodel.TargetTypeService, "add-service-port", dbmodel.SYNEVENTTYPE))
|
|
r.Put("/ports", middleware.WrapEL(controller.GetManager().PutPorts, dbmodel.TargetTypeService, "update-service-port-old", dbmodel.SYNEVENTTYPE))
|
|
r.Put("/ports/{port}", middleware.WrapEL(controller.GetManager().Ports, dbmodel.TargetTypeService, "update-service-port", dbmodel.SYNEVENTTYPE))
|
|
r.Delete("/ports/{port}", middleware.WrapEL(controller.GetManager().Ports, dbmodel.TargetTypeService, "delete-service-port", dbmodel.SYNEVENTTYPE))
|
|
r.Put("/ports/{port}/outer", middleware.WrapEL(controller.GetManager().PortOuterController, dbmodel.TargetTypeService, "handle-service-outerport", dbmodel.SYNEVENTTYPE))
|
|
r.Put("/ports/{port}/inner", middleware.WrapEL(controller.GetManager().PortInnerController, dbmodel.TargetTypeService, "handle-service-innerport", dbmodel.SYNEVENTTYPE))
|
|
|
|
//应用版本回滚(act)
|
|
r.Post("/rollback", middleware.WrapEL(controller.GetManager().RollBack, dbmodel.TargetTypeService, "rollback-service", dbmodel.ASYNEVENTTYPE))
|
|
|
|
//持久化信息API v2.1 支持多种持久化格式
|
|
r.Post("/volumes", middleware.WrapEL(controller.AddVolume, dbmodel.TargetTypeService, "add-service-volume", dbmodel.SYNEVENTTYPE))
|
|
r.Put("/volumes", middleware.WrapEL(controller.GetManager().UpdVolume, dbmodel.TargetTypeService, "update-service-volume", dbmodel.SYNEVENTTYPE))
|
|
r.Get("/volumes", controller.GetVolume)
|
|
r.Delete("/volumes/{volume_name}", middleware.WrapEL(controller.DeleteVolume, dbmodel.TargetTypeService, "delete-service-volume", dbmodel.SYNEVENTTYPE))
|
|
r.Post("/depvolumes", middleware.WrapEL(controller.AddVolumeDependency, dbmodel.TargetTypeService, "add-service-depvolume", dbmodel.SYNEVENTTYPE))
|
|
r.Delete("/depvolumes", middleware.WrapEL(controller.DeleteVolumeDependency, dbmodel.TargetTypeService, "delete-service-depvolume", dbmodel.SYNEVENTTYPE))
|
|
r.Get("/depvolumes", controller.GetDepVolume)
|
|
//持久化信息API v2
|
|
r.Post("/volume-dependency", middleware.WrapEL(controller.GetManager().VolumeDependency, dbmodel.TargetTypeService, "add-service-depvolume", dbmodel.SYNEVENTTYPE))
|
|
r.Delete("/volume-dependency", middleware.WrapEL(controller.GetManager().VolumeDependency, dbmodel.TargetTypeService, "delete-service-depvolume", dbmodel.SYNEVENTTYPE))
|
|
r.Post("/volume", middleware.WrapEL(controller.GetManager().AddVolume, dbmodel.TargetTypeService, "add-service-volume", dbmodel.SYNEVENTTYPE))
|
|
r.Delete("/volume", middleware.WrapEL(controller.GetManager().DeleteVolume, dbmodel.TargetTypeService, "delete-service-volume", dbmodel.SYNEVENTTYPE))
|
|
|
|
//获取应用实例情况(source)
|
|
r.Get("/pods", controller.GetManager().Pods)
|
|
|
|
//应用探针 增 删 改(surce)
|
|
r.Post("/probe", middleware.WrapEL(controller.GetManager().Probe, dbmodel.TargetTypeService, "add-service-probe", dbmodel.SYNEVENTTYPE))
|
|
r.Put("/probe", middleware.WrapEL(controller.GetManager().Probe, dbmodel.TargetTypeService, "update-service-probe", dbmodel.SYNEVENTTYPE))
|
|
r.Delete("/probe", middleware.WrapEL(controller.GetManager().Probe, dbmodel.TargetTypeService, "delete-service-probe", dbmodel.SYNEVENTTYPE))
|
|
|
|
r.Post("/label", middleware.WrapEL(controller.GetManager().Label, dbmodel.TargetTypeService, "add-service-label", dbmodel.SYNEVENTTYPE))
|
|
r.Put("/label", middleware.WrapEL(controller.GetManager().Label, dbmodel.TargetTypeService, "update-service-label", dbmodel.SYNEVENTTYPE))
|
|
r.Delete("/label", middleware.WrapEL(controller.GetManager().Label, dbmodel.TargetTypeService, "delete-service-label", dbmodel.SYNEVENTTYPE))
|
|
|
|
//插件
|
|
r.Mount("/plugin", v2.serviceRelatePluginRouter())
|
|
|
|
//rule
|
|
r.Mount("/net-rule", v2.rulesRouter())
|
|
r.Get("/deploy-info", controller.GetServiceDeployInfo)
|
|
|
|
// third-party service
|
|
r.Post("/endpoints", middleware.WrapEL(controller.GetManager().Endpoints, dbmodel.TargetTypeService, "add-thirdpart-service", dbmodel.SYNEVENTTYPE))
|
|
r.Put("/endpoints", middleware.WrapEL(controller.GetManager().Endpoints, dbmodel.TargetTypeService, "update-thirdpart-service", dbmodel.SYNEVENTTYPE))
|
|
r.Delete("/endpoints", middleware.WrapEL(controller.GetManager().Endpoints, dbmodel.TargetTypeService, "delete-thirdpart-service", dbmodel.SYNEVENTTYPE))
|
|
r.Get("/endpoints", controller.GetManager().Endpoints)
|
|
|
|
// gateway
|
|
r.Put("/rule-config", middleware.WrapEL(controller.GetManager().RuleConfig, dbmodel.TargetTypeService, "update-service-gateway-rule", dbmodel.SYNEVENTTYPE))
|
|
|
|
// app restore
|
|
r.Post("/app-restore/envs", middleware.WrapEL(controller.GetManager().RestoreEnvs, dbmodel.TargetTypeService, "app-restore-envs", dbmodel.SYNEVENTTYPE))
|
|
r.Post("/app-restore/ports", middleware.WrapEL(controller.GetManager().RestorePorts, dbmodel.TargetTypeService, "app-restore-ports", dbmodel.SYNEVENTTYPE))
|
|
r.Post("/app-restore/volumes", middleware.WrapEL(controller.GetManager().RestoreVolumes, dbmodel.TargetTypeService, "app-restore-volumes", dbmodel.SYNEVENTTYPE))
|
|
r.Post("/app-restore/probe", middleware.WrapEL(controller.GetManager().RestoreProbe, dbmodel.TargetTypeService, "app-restore-probe", dbmodel.SYNEVENTTYPE))
|
|
r.Post("/app-restore/deps", middleware.WrapEL(controller.GetManager().RestoreDeps, dbmodel.TargetTypeService, "app-restore-deps", dbmodel.SYNEVENTTYPE))
|
|
r.Post("/app-restore/depvols", middleware.WrapEL(controller.GetManager().RestoreDepVols, dbmodel.TargetTypeService, "app-restore-depvols", dbmodel.SYNEVENTTYPE))
|
|
r.Post("/app-restore/plugins", middleware.WrapEL(controller.GetManager().RestorePlugins, dbmodel.TargetTypeService, "app-restore-plugins", dbmodel.SYNEVENTTYPE))
|
|
|
|
r.Get("/pods/{pod_name}/detail", controller.GetManager().PodDetail)
|
|
|
|
// autoscaler
|
|
r.Post("/xparules", middleware.WrapEL(controller.GetManager().AutoscalerRules, dbmodel.TargetTypeService, "add-app-autoscaler-rule", dbmodel.SYNEVENTTYPE))
|
|
r.Put("/xparules", middleware.WrapEL(controller.GetManager().AutoscalerRules, dbmodel.TargetTypeService, "update-app-autoscaler-rule", dbmodel.SYNEVENTTYPE))
|
|
r.Get("/xparecords", controller.GetManager().ScalingRecords)
|
|
|
|
return r
|
|
}
|
|
|
|
func (v2 *V2) resourcesRouter() chi.Router {
|
|
r := chi.NewRouter()
|
|
r.Get("/labels", controller.GetManager().Labels)
|
|
r.Post("/tenants", controller.GetManager().TenantResources)
|
|
r.Post("/services", controller.GetManager().ServiceResources)
|
|
r.Get("/tenants/sum", controller.GetManager().SumTenants)
|
|
//tenants's resource
|
|
r.Get("/tenants/res", controller.GetManager().TenantsWithResource)
|
|
r.Get("/tenants/res/page/{curPage}/size/{pageLen}", controller.GetManager().TenantsWithResource)
|
|
r.Get("/tenants/query/{tenant_name}", controller.GetManager().TenantsQuery)
|
|
r.Get("/tenants/{tenant_name}/res", controller.GetManager().TenantsGetByName)
|
|
return r
|
|
}
|
|
|
|
func (v2 *V2) prometheusRouter() chi.Router {
|
|
r := chi.NewRouter()
|
|
return r
|
|
}
|
|
|
|
func (v2 *V2) appRouter() chi.Router {
|
|
r := chi.NewRouter()
|
|
r.Post("/export", controller.GetManager().ExportApp)
|
|
r.Get("/export/{eventID}", controller.GetManager().ExportApp)
|
|
|
|
r.Get("/download/{format}/{fileName}", controller.GetManager().Download)
|
|
r.Post("/upload/{eventID}", controller.GetManager().NewUpload)
|
|
r.Options("/upload/{eventID}", controller.GetManager().NewUpload)
|
|
|
|
r.Post("/import/ids/{eventID}", controller.GetManager().ImportID)
|
|
r.Get("/import/ids/{eventID}", controller.GetManager().ImportID)
|
|
r.Delete("/import/ids/{eventID}", controller.GetManager().ImportID)
|
|
|
|
r.Post("/import", controller.GetManager().ImportApp)
|
|
r.Get("/import/{eventID}", controller.GetManager().ImportApp)
|
|
r.Delete("/import/{eventID}", controller.GetManager().ImportApp)
|
|
return r
|
|
}
|
|
|
|
func (v2 *V2) notificationEventRouter() chi.Router {
|
|
r := chi.NewRouter()
|
|
r.Get("/", controller.GetNotificationEvents)
|
|
r.Put("/{serviceAlias}", controller.HandleNotificationEvent)
|
|
r.Get("/{hash}", controller.GetNotificationEvent)
|
|
return r
|
|
}
|
|
|
|
func (v2 *V2) portRouter() chi.Router {
|
|
r := chi.NewRouter()
|
|
r.Get("/avail-port", controller.GetManager().GetAvailablePort)
|
|
return r
|
|
}
|