Unverified Commit 7f23165e authored by Zhiyu Wang's avatar Zhiyu Wang Committed by GitHub
Browse files

Feat: deploy user info (#3744)

Signed-off-by: default avatarZhiyu Wang <zhiyuwang.newbis@gmail.com>
parent ba0c2269
Showing with 127 additions and 81 deletions
+127 -81
......@@ -6838,8 +6838,8 @@
},
"model.Cluster": {
"required": [
"createTime",
"updateTime",
"createTime",
"name",
"alias",
"description",
......@@ -7547,12 +7547,12 @@
},
"v1.ApplicationDeployResponse": {
"required": [
"version",
"status",
"triggerType",
"createTime",
"note",
"envName",
"triggerType",
"version",
"status"
"envName"
],
"properties": {
"codeInfo": {
......@@ -7563,7 +7563,7 @@
"format": "date-time"
},
"deployUser": {
"type": "string"
"$ref": "#/definitions/v1.NameAlias"
},
"envName": {
"type": "string"
......@@ -7661,7 +7661,7 @@
"format": "date-time"
},
"deployUser": {
"type": "string"
"$ref": "#/definitions/v1.NameAlias"
},
"envName": {
"type": "string"
......@@ -8714,11 +8714,11 @@
},
"v1.DetailAddonResponse": {
"required": [
"invisible",
"version",
"description",
"icon",
"description",
"invisible",
"name",
"version",
"schema",
"uiSchema",
"definitions",
......@@ -8798,13 +8798,13 @@
},
"v1.DetailApplicationResponse": {
"required": [
"updateTime",
"name",
"description",
"alias",
"project",
"createTime",
"description",
"updateTime",
"icon",
"name",
"alias",
"policies",
"envBindings",
"applicationType",
......@@ -8865,20 +8865,20 @@
},
"v1.DetailClusterResponse": {
"required": [
"description",
"status",
"dashboardURL",
"name",
"alias",
"provider",
"apiServerURL",
"createTime",
"updateTime",
"reason",
"kubeConfig",
"icon",
"labels",
"status",
"provider",
"kubeConfigSecret",
"kubeConfig",
"updateTime",
"createTime",
"alias",
"description",
"icon",
"reason",
"dashboardURL",
"resourceInfo"
],
"properties": {
......@@ -8936,14 +8936,14 @@
},
"v1.DetailComponentResponse": {
"required": [
"name",
"type",
"createTime",
"updateTime",
"creator",
"name",
"main",
"updateTime",
"appPrimaryKey",
"createTime",
"alias",
"type",
"definition"
],
"properties": {
......@@ -9029,11 +9029,11 @@
"v1.DetailDefinitionResponse": {
"required": [
"alias",
"description",
"icon",
"status",
"name",
"labels",
"name",
"description",
"schema",
"uiSchema"
],
......@@ -9087,13 +9087,13 @@
},
"v1.DetailPolicyResponse": {
"required": [
"creator",
"properties",
"createTime",
"updateTime",
"name",
"type",
"description",
"creator",
"properties",
"createTime"
"description"
],
"properties": {
"createTime": {
......@@ -9123,17 +9123,17 @@
},
"v1.DetailRevisionResponse": {
"required": [
"createTime",
"status",
"updateTime",
"version",
"triggerType",
"appPrimaryKey",
"note",
"reason",
"deployUser",
"triggerType",
"createTime",
"note",
"appPrimaryKey",
"version",
"status",
"workflowName",
"envName"
"envName",
"updateTime"
],
"properties": {
"appPrimaryKey": {
......@@ -9150,7 +9150,7 @@
"format": "date-time"
},
"deployUser": {
"type": "string"
"$ref": "#/definitions/v1.NameAlias"
},
"envName": {
"type": "string"
......@@ -9187,10 +9187,10 @@
},
"v1.DetailTargetResponse": {
"required": [
"name",
"updateTime",
"createTime",
"project"
"project",
"name",
"updateTime"
],
"properties": {
"alias": {
......@@ -9230,11 +9230,11 @@
},
"v1.DetailUserResponse": {
"required": [
"email",
"disabled",
"createTime",
"lastLoginTime",
"name",
"email",
"projects",
"roles"
],
......@@ -9275,12 +9275,12 @@
},
"v1.DetailWorkflowRecordResponse": {
"required": [
"namespace",
"workflowName",
"workflowAlias",
"applicationRevision",
"status",
"name",
"namespace",
"workflowName",
"deployTime",
"deployUser",
"note",
......@@ -9333,13 +9333,13 @@
"v1.DetailWorkflowResponse": {
"required": [
"name",
"enable",
"envName",
"updateTime",
"alias",
"description",
"enable",
"envName",
"default",
"createTime"
"createTime",
"updateTime"
],
"properties": {
"alias": {
......@@ -9918,11 +9918,11 @@
},
"v1.LoginUserInfoResponse": {
"required": [
"email",
"disabled",
"createTime",
"lastLoginTime",
"name",
"email",
"projects",
"platformPermissions",
"projectPermissions"
......@@ -10848,6 +10848,9 @@
"type": "string"
}
},
"controlPlaneOnly": {
"type": "boolean"
},
"definitionRef": {
"$ref": "#/definitions/common.DefinitionReference"
},
......
......@@ -35,6 +35,9 @@ func init() {
// DefaultAdminUserName default admin user name
const DefaultAdminUserName = "admin"
// DefaultAdminUserAlias default admin user alias
const DefaultAdminUserAlias = "Administrator"
// User is the model of user
type User struct {
BaseModel
......
......@@ -1106,13 +1106,13 @@ type TargetBase struct {
// ApplicationRevisionBase application revision base spec
type ApplicationRevisionBase struct {
CreateTime time.Time `json:"createTime"`
Version string `json:"version"`
Status string `json:"status"`
Reason string `json:"reason,omitempty"`
DeployUser string `json:"deployUser,omitempty"`
Note string `json:"note"`
EnvName string `json:"envName"`
CreateTime time.Time `json:"createTime"`
Version string `json:"version"`
Status string `json:"status"`
Reason string `json:"reason,omitempty"`
DeployUser *NameAlias `json:"deployUser,omitempty"`
Note string `json:"note"`
EnvName string `json:"envName"`
// SourceType the event trigger source, Web or API or Webhook
TriggerType string `json:"triggerType"`
// CodeInfo is the code info of this application revision
......@@ -1130,6 +1130,7 @@ type ListRevisionsResponse struct {
// DetailRevisionResponse get application revision detail
type DetailRevisionResponse struct {
model.ApplicationRevision
DeployUser NameAlias `json:"deployUser,omitempty"`
}
// SystemInfoResponse get SystemInfo
......
......@@ -117,6 +117,7 @@ type applicationUsecaseImpl struct {
targetUsecase TargetUsecase
definitionUsecase DefinitionUsecase
projectUsecase ProjectUsecase
userUsecase UserUsecase
}
// NewApplicationUsecase new application usecase
......@@ -127,6 +128,7 @@ func NewApplicationUsecase(ds datastore.DataStore,
targetUsecase TargetUsecase,
definitionUsecase DefinitionUsecase,
projectUsecase ProjectUsecase,
userUsecase UserUsecase,
) ApplicationUsecase {
kubecli, err := clients.GetKubeClient()
if err != nil {
......@@ -142,6 +144,7 @@ func NewApplicationUsecase(ds datastore.DataStore,
definitionUsecase: definitionUsecase,
projectUsecase: projectUsecase,
envUsecase: envUsecase,
userUsecase: userUsecase,
}
}
......@@ -690,6 +693,13 @@ func (c *applicationUsecaseImpl) DetailPolicy(ctx context.Context, app *model.Ap
// means to render oam application config and apply to cluster.
// An event record is generated for each deploy.
func (c *applicationUsecaseImpl) Deploy(ctx context.Context, app *model.Application, req apisv1.ApplicationDeployRequest) (*apisv1.ApplicationDeployResponse, error) {
var userName string
if user := ctx.Value(&apisv1.CtxKeyUser); user != nil {
if u, ok := user.(string); ok {
userName = u
}
}
// TODO: rollback to handle all the error case
// step1: Render oam application
version := utils.GenerateVersion("")
......@@ -747,14 +757,13 @@ func (c *applicationUsecaseImpl) Deploy(ctx context.Context, app *model.Applicat
Version: version,
ApplyAppConfig: string(configByte),
Status: model.RevisionStatusInit,
// TODO: Get user information from ctx and assign a value.
DeployUser: "",
Note: req.Note,
TriggerType: req.TriggerType,
WorkflowName: oamApp.Annotations[oam.AnnotationWorkflowName],
EnvName: workflow.EnvName,
CodeInfo: req.CodeInfo,
ImageInfo: req.ImageInfo,
DeployUser: userName,
Note: req.Note,
TriggerType: req.TriggerType,
WorkflowName: oamApp.Annotations[oam.AnnotationWorkflowName],
EnvName: workflow.EnvName,
CodeInfo: req.CodeInfo,
ImageInfo: req.ImageInfo,
}
if err := c.ds.Add(ctx, appRevision); err != nil {
return nil, err
......@@ -793,7 +802,7 @@ func (c *applicationUsecaseImpl) Deploy(ctx context.Context, app *model.Applicat
}
return &apisv1.ApplicationDeployResponse{
ApplicationRevisionBase: c.convertRevisionModelToBase(appRevision),
ApplicationRevisionBase: c.convertRevisionModelToBase(ctx, appRevision),
}, nil
}
......@@ -1000,12 +1009,11 @@ func (c *applicationUsecaseImpl) convertAppModelToBase(app *model.Application, p
return appBase
}
func (c *applicationUsecaseImpl) convertRevisionModelToBase(revision *model.ApplicationRevision) apisv1.ApplicationRevisionBase {
return apisv1.ApplicationRevisionBase{
func (c *applicationUsecaseImpl) convertRevisionModelToBase(ctx context.Context, revision *model.ApplicationRevision) apisv1.ApplicationRevisionBase {
base := apisv1.ApplicationRevisionBase{
Version: revision.Version,
Status: revision.Status,
Reason: revision.Reason,
DeployUser: revision.DeployUser,
Note: revision.Note,
TriggerType: revision.TriggerType,
CreateTime: revision.CreateTime,
......@@ -1013,6 +1021,14 @@ func (c *applicationUsecaseImpl) convertRevisionModelToBase(revision *model.Appl
CodeInfo: revision.CodeInfo,
ImageInfo: revision.ImageInfo,
}
if revision.DeployUser != "" {
base.DeployUser = &apisv1.NameAlias{Name: revision.DeployUser}
deployUser, _ := c.userUsecase.GetUser(ctx, revision.DeployUser)
if deployUser != nil {
base.DeployUser.Alias = deployUser.Alias
}
}
return base
}
// DeleteApplication delete application
......@@ -1433,7 +1449,7 @@ func (c *applicationUsecaseImpl) ListRevisions(ctx context.Context, appName, env
for _, raw := range revisions {
r, ok := raw.(*model.ApplicationRevision)
if ok {
resp.Revisions = append(resp.Revisions, c.convertRevisionModelToBase(r))
resp.Revisions = append(resp.Revisions, c.convertRevisionModelToBase(ctx, r))
}
}
count, err := c.ds.Count(ctx, &revision, nil)
......@@ -1453,9 +1469,22 @@ func (c *applicationUsecaseImpl) DetailRevision(ctx context.Context, appName, re
if err := c.ds.Get(ctx, &revision); err != nil {
return nil, err
}
return &apisv1.DetailRevisionResponse{
resp := &apisv1.DetailRevisionResponse{
ApplicationRevision: revision,
}, nil
DeployUser: apisv1.NameAlias{
Name: revision.DeployUser,
},
}
if revision.DeployUser != "" {
deployUser, _ := c.userUsecase.GetUser(ctx, revision.DeployUser)
if deployUser != nil {
resp.DeployUser.Alias = deployUser.Alias
}
}
return resp, nil
}
func (c *applicationUsecaseImpl) Statistics(ctx context.Context, app *model.Application) (*apisv1.ApplicationStatisticsResponse, error) {
......
......@@ -87,6 +87,7 @@ var _ = Describe("Test application usecase function", func() {
definitionUsecase: definitionUsecase,
targetUsecase: targetUsecase,
projectUsecase: projectUsecase,
userUsecase: userUsecase,
}
})
......@@ -97,6 +98,7 @@ var _ = Describe("Test application usecase function", func() {
ns.Name = types.DefaultKubeVelaNS
err := k8sClient.Create(context.TODO(), &ns)
Expect(err).Should(SatisfyAny(BeNil(), &util.AlreadyExistMatcher{}))
err = userUsecase.Init(context.TODO())
Expect(err).Should(BeNil())
......@@ -339,6 +341,7 @@ var _ = Describe("Test application usecase function", func() {
Version: fmt.Sprintf("%d", i),
EnvName: fmt.Sprintf("env-%d", i),
Status: model.RevisionStatusRunning,
DeployUser: model.DefaultAdminUserName,
}
if i == 0 {
appModel.Status = model.RevisionStatusTerminated
......@@ -353,6 +356,8 @@ var _ = Describe("Test application usecase function", func() {
revisions, err = appUsecase.ListRevisions(context.TODO(), "test-app-sadasd", "env-0", "", 0, 10)
Expect(err).Should(BeNil())
Expect(revisions.Total).Should(Equal(int64(1)))
Expect(revisions.Revisions[0].DeployUser.Name).Should(Equal(model.DefaultAdminUserName))
Expect(revisions.Revisions[0].DeployUser.Alias).Should(Equal(model.DefaultAdminUserAlias))
revisions, err = appUsecase.ListRevisions(context.TODO(), "test-app-sadasd", "", "terminated", 0, 10)
Expect(err).Should(BeNil())
......@@ -367,20 +372,25 @@ var _ = Describe("Test application usecase function", func() {
err := workflowUsecase.createTestApplicationRevision(context.TODO(), &model.ApplicationRevision{
AppPrimaryKey: "test-app",
Version: "123",
DeployUser: "test-user",
DeployUser: model.DefaultAdminUserName,
})
Expect(err).Should(BeNil())
revision, err := appUsecase.DetailRevision(context.TODO(), "test-app", "123")
Expect(err).Should(BeNil())
Expect(revision.Version).Should(Equal("123"))
Expect(revision.DeployUser).Should(Equal("test-user"))
Expect(revision.DeployUser.Name).Should(Equal(model.DefaultAdminUserName))
Expect(revision.DeployUser.Alias).Should(Equal(model.DefaultAdminUserAlias))
})
It("Test ApplicationEnvRecycle function", func() {
appModel, err := appUsecase.GetApplication(context.TODO(), testApp)
Expect(err).Should(BeNil())
_, err = appUsecase.Deploy(context.TODO(), appModel, v1.ApplicationDeployRequest{WorkflowName: convertWorkflowName("app-dev")})
revision, err := appUsecase.Deploy(
context.WithValue(context.TODO(), &v1.CtxKeyUser, model.DefaultAdminUserName),
appModel, v1.ApplicationDeployRequest{WorkflowName: convertWorkflowName("app-dev")})
Expect(err).Should(BeNil())
Expect(revision.DeployUser.Name).Should(Equal(model.DefaultAdminUserName))
Expect(revision.DeployUser.Alias).Should(Equal(model.DefaultAdminUserAlias))
err = envBindingUsecase.ApplicationEnvRecycle(context.TODO(), &model.Application{
Name: testApp,
}, &model.EnvBinding{Name: "app-dev"})
......
......@@ -87,7 +87,7 @@ func (u *userUsecaseImpl) Init(ctx context.Context) error {
}
if err := u.ds.Add(ctx, &model.User{
Name: admin,
Alias: "Administrator",
Alias: model.DefaultAdminUserAlias,
Password: encrypted,
UserRoles: []string{"admin"},
}); err != nil {
......
......@@ -76,7 +76,7 @@ func Init(ctx context.Context, ds datastore.DataStore, addonCacheTime time.Durat
userUsecase := usecase.NewUserUsecase(ds, projectUsecase, systemInfoUsecase, rbacUsecase)
authenticationUsecase := usecase.NewAuthenticationUsecase(ds, systemInfoUsecase, userUsecase)
configUseCase := usecase.NewConfigUseCase(authenticationUsecase)
applicationUsecase := usecase.NewApplicationUsecase(ds, workflowUsecase, envBindingUsecase, envUsecase, targetUsecase, definitionUsecase, projectUsecase)
applicationUsecase := usecase.NewApplicationUsecase(ds, workflowUsecase, envBindingUsecase, envUsecase, targetUsecase, definitionUsecase, projectUsecase, userUsecase)
webhookUsecase := usecase.NewWebhookUsecase(ds, applicationUsecase)
// Modules that require default data initialization, Call it here in order
if initDatabase {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment