Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🌿 Wip - Minor: Fix Err Handling and Create Command / Service #150

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added Contributing-Guide.md
Empty file.
11 changes: 10 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
# Zerops zCLI
![Zerops](https://github.com/zeropsio/recipe-shared-assets/blob/main/covers/svg/cover-zcli.svg)

<p align="center">
<br/>
<h2>Zerops zCli</h2>
A Command Line Utility / Command Line Interface is used for interacting with <a href="https://zerops.io/">Zerops</a> platform &mdash;
<br/>
powerful developer experience meets lightweight output.
<br/><br/>
</p>

Zerops zCLI is a command line utility for working with [zerops.io](https://zerops.io). It's used
for **CI/CD** development and CLI lovers.
Expand Down
3 changes: 2 additions & 1 deletion src/cmd/project.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ func projectCmd() *cmdBuilder.Cmd {
AddChildrenCmd(projectListCmd()).
AddChildrenCmd(projectDeleteCmd()).
AddChildrenCmd(projectServiceImportCmd()).
AddChildrenCmd(projectImportCmd())
AddChildrenCmd(projectImportCmd()).
AddChildrenCmd(projectCreateCmd())
}
45 changes: 45 additions & 0 deletions src/cmd/projectCreate.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package cmd

import (
"context"

"github.com/pkg/errors"

"github.com/zeropsio/zcli/src/cmd/scope"
"github.com/zeropsio/zcli/src/cmdBuilder"
"github.com/zeropsio/zcli/src/i18n"
"github.com/zeropsio/zcli/src/uxHelpers"
"github.com/zeropsio/zerops-go/dto/input/body"
"github.com/zeropsio/zerops-go/sdk"
)

func projectCreateCmd() *cmdBuilder.Cmd {
return cmdBuilder.NewCmd().
Use("create").
Short(i18n.T(i18n.CmdDescProjectCreate)).
ScopeLevel(scope.Project).
Arg(scope.ProjectArgName, cmdBuilder.OptionalArg()).
BoolFlag("confirm", false, i18n.T(i18n.ConfirmFlag)).
HelpFlag(i18n.T(i18n.CmdHelpProjectCreate)).
LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error {
if !cmdData.Params.GetBool("confirm") {
confirmed, err := uxHelpers.YesNoPrompt(
ctx,
cmdData.UxBlocks,
i18n.T(i18n.ProjectCreateConfirm, cmdData.Project.Name),
)
if err != nil {
return err
}
if !confirmed {
return errors.New(i18n.T(i18n.DestructiveOperationConfirmationFailed))
}
}

sdk.Handler{}.PostProject(ctx, body.PostProject{

Check failure on line 39 in src/cmd/projectCreate.go

View workflow job for this annotation

GitHub Actions / Build && tests for linux 386

Error return value of `(github.com/zeropsio/zerops-go/sdk.Handler).PostProject` is not checked (errcheck)

Check failure on line 39 in src/cmd/projectCreate.go

View workflow job for this annotation

GitHub Actions / Build && tests for darwin amd64

Error return value of `(github.com/zeropsio/zerops-go/sdk.Handler).PostProject` is not checked (errcheck)
Name: cmdData.Project.Name,
})

return nil
})
}
163 changes: 82 additions & 81 deletions src/cmd/projectImport.go
Original file line number Diff line number Diff line change
@@ -1,43 +1,44 @@
package cmd

import (
"context"

"github.com/zeropsio/zcli/src/cmdBuilder"
"github.com/zeropsio/zcli/src/entity/repository"
"github.com/zeropsio/zcli/src/i18n"
"github.com/zeropsio/zcli/src/uxBlock/styles"
"github.com/zeropsio/zcli/src/uxHelpers"
"github.com/zeropsio/zcli/src/yamlReader"
"github.com/zeropsio/zerops-go/dto/input/body"
"github.com/zeropsio/zerops-go/types"
"github.com/zeropsio/zerops-go/types/uuid"
"context"
"github.com/zeropsio/zcli/src/cmdBuilder"
"github.com/zeropsio/zcli/src/entity/repository"
"github.com/zeropsio/zcli/src/i18n"
"github.com/zeropsio/zcli/src/uxBlock/styles"
"github.com/zeropsio/zcli/src/uxHelpers"
"github.com/zeropsio/zcli/src/yamlReader"
"github.com/zeropsio/zerops-go/dto/input/body"
"github.com/zeropsio/zerops-go/types"
"github.com/zeropsio/zerops-go/types/uuid"
"path/filepath"
)

const projectImportArgName = "importYamlPath"
const defaultYamlFileName = "foo.yml"

func projectImportCmd() *cmdBuilder.Cmd {
return cmdBuilder.NewCmd().
Use("project-import").
Short(i18n.T(i18n.CmdDescProjectImport)).
Long(i18n.T(i18n.CmdDescProjectImportLong)).
Arg(projectImportArgName).
StringFlag("orgId", "", i18n.T(i18n.OrgIdFlag)).
StringFlag("workingDie", "./", i18n.T(i18n.BuildWorkingDir)).
HelpFlag(i18n.T(i18n.CmdHelpProjectImport)).
LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error {
uxBlocks := cmdData.UxBlocks

orgId, err := getOrgId(ctx, cmdData)
return cmdBuilder.NewCmd().
Use("import").
Short(i18n.T(i18n.CmdDescProjectImport)).
Long(i18n.T(i18n.CmdDescProjectImportLong)).
StringFlag("orgId", "", i18n.T(i18n.OrgIdFlag)).
StringFlag("workingDir", "./", i18n.T(i18n.BuildWorkingDir)).
HelpFlag(i18n.T(i18n.CmdHelpProjectImport)).
LoggedUserRunFunc(func(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) error {
uxBlocks := cmdData.UxBlocks

orgId, err := getOrgId(ctx, cmdData)
if err != nil {
return err
}

workingDir := cmdData.Params.GetString("workingDir")
yamlFilePath := filepath.Join(workingDir, defaultYamlFileName)
if err != nil {
uxBlocks.PrintError(styles.ErrorLine(i18n.T(i18n.NoYamlFound)))
return err
}

yamlContent, err := yamlReader.ReadContent(
uxBlocks,
cmdData.Args[projectImportArgName][0],
cmdData.Params.GetString("workingDir"),
)
yamlContent, err := yamlReader.ReadContent(uxBlocks, yamlFilePath, workingDir)
if err != nil {
return err
}
Expand All @@ -46,64 +47,64 @@ func projectImportCmd() *cmdBuilder.Cmd {
ctx,
body.ProjectImport{
ClientId: orgId,
Yaml: types.Text(yamlContent),
Yaml: types.Text(yamlContent),
},
)
if err != nil {
uxBlocks.PrintError(styles.ErrorLine(i18n.T(i18n.ProjectImportFailed)))
return err
}

responseOutput, err := importProjectResponse.Output()
if err != nil {
return err
}

var processes []uxHelpers.Process
for _, service := range responseOutput.ServiceStacks {
for _, process := range service.Processes {
processes = append(processes, uxHelpers.Process{
F: uxHelpers.CheckZeropsProcess(process.Id, cmdData.RestApiClient),
RunningMessage: service.Name.String() + ": " + process.ActionName.String(),
ErrorMessageMessage: service.Name.String() + ": " + process.ActionName.String(),
SuccessMessage: service.Name.String() + ": " + process.ActionName.String(),
})
}
}

uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.ServiceCount, len(responseOutput.ServiceStacks))))
uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.QueuedProcesses, len(processes))))
uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.CoreServices)))

err = uxHelpers.ProcessCheckWithSpinner(ctx, cmdData.UxBlocks, processes)
projectOutput, err := importProjectResponse.Output()
if err != nil {
return err
}

uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.ProjectImported)))

return nil
})
uxBlocks.PrintError(styles.ErrorLine(i18n.T(i18n.ProjectImportFailed)))
}

var processes []uxHelpers.Process
for _, service := range projectOutput.ServiceStacks {
for _, process := range service.Processes {
processes = append(processes, uxHelpers.Process{
F: uxHelpers.CheckZeropsProcess(process.Id, cmdData.RestApiClient),
RunningMessage: service.Name.String() + ": " + process.ActionName.String(),
ErrorMessageMessage: service.Name.String() + ": " + process.ActionName.String(),
SuccessMessage: service.Name.String() + ": " + process.ActionName.String(),
})
}
}

uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.ServiceCount, len(projectOutput.ServiceStacks))))
uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.QueuedProcesses, len(processes))))
uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.CoreServices)))

err = uxHelpers.ProcessCheckWithSpinner(ctx, cmdData.UxBlocks, processes)
if err != nil {
return err
}

uxBlocks.PrintInfo(styles.InfoLine(i18n.T(i18n.ProjectImported)))
return nil
})
}

func getOrgId(ctx context.Context, cmdData *cmdBuilder.LoggedUserCmdData) (uuid.ClientId, error) {
orgId := uuid.ClientId(cmdData.Params.GetString("orgId"))
if orgId != "" {
return orgId, nil
}

orgs, err := repository.GetAllOrgs(ctx, cmdData.RestApiClient)
if err != nil {
return "", err
}

if len(orgs) == 1 {
return orgs[0].ID, nil
}

selectedOrg, err := uxHelpers.PrintOrgSelector(ctx, cmdData.UxBlocks, cmdData.RestApiClient)
if err != nil {
return "", err
}

return selectedOrg.ID, nil
}
orgId := uuid.ClientId(cmdData.Params.GetString("orgId"))
if orgId != "" {
return orgId, nil
}

orgs, err := repository.GetAllOrgs(ctx, cmdData.RestApiClient)
if err != nil {
return "", err
}

if len(orgs) == 1 {
return orgs[0].ID, nil
}

selectedOrg, err := uxHelpers.PrintOrgSelector(ctx, cmdData.UxBlocks, cmdData.RestApiClient)
if err != nil {
return "", err
}

return selectedOrg.ID, nil
}
17 changes: 14 additions & 3 deletions src/i18n/en.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,15 @@ var en = map[string]string{
CmdHelpProjectList: "the project list command.",
CmdDescProjectList: "Lists all projects.",

// project create
CmdHelpProjectCreate: "the project create command.",
CmdDescProjectCreate: "Creates an empty project.",
ProjectCreateConfirm: "Creating %s a new empty project ? \n Are you sure?",
ServiceCreateConfirm: "Would you like to create a new service? \n y/n",
ProjectCreation: "Project is being created.",
ProjectCreationFailed: "Creation of a new project failed.",
ProjectCreated: "Project created successfully",

// project delete
CmdHelpProjectDelete: "the project delete command.",
CmdDescProjectDelete: "Deletes a project and all of its services.",
Expand All @@ -41,9 +50,11 @@ var en = map[string]string{

// project import
CmdHelpProjectImport: "the project import command.",
CmdDescProjectImport: "Creates a new project with one or more services.",
CmdDescProjectImport: "Initializes a new project with one or more services with foo.yaml.",
CmdDescProjectImportLong: "Creates a new project with one or more services according to the definition in the import YAML file.",
ProjectImported: "project imported",
ProjectImported: "Project imported",
NoYamlFound: "No foo.yml file detected in your directory. For more information, please visit https://docs.zerops.io/references/import/.",
ProjectImportFailed: "Failed while importing, seems like there's an issue try reaching out at https://discord.com/invite/WDvCZ54",

// project service import
CmdHelpProjectServiceImport: "the project service import command.",
Expand Down Expand Up @@ -218,7 +229,7 @@ var en = map[string]string{

// import
ImportYamlOk: "Yaml file was checked",
ImportYamlEmpty: "Config file import yaml is empty",
ImportYamlEmpty: "The config foo.yml file is empty. For more information, please visit https://docs.zerops.io/references/import/",
ImportYamlTooLarge: "Max. size of import yaml is 100 KB",
ImportYamlFound: "Import yaml found",
ImportYamlNotFound: "Import yaml not found",
Expand Down
11 changes: 11 additions & 0 deletions src/i18n/i18n.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,15 @@ const (
CmdHelpProjectList = "CmdHelpProjectList"
CmdDescProjectList = "CmdDescProjectList"

// project create
CmdHelpProjectCreate = "CmdHelpProjectCreate"
CmdDescProjectCreate = "CmdDescProjectCreate"
ProjectCreateConfirm = "ProjectCreateConfirm"
ServiceCreateConfirm = "ServiceCreateConfirm"
ProjectCreation = "ProjectCreation"
ProjectCreationFailed = "ProjectCreationFailed"
ProjectCreated = "ProjectCreated"

// project delete
CmdHelpProjectDelete = "CmdHelpProjectDelete"
CmdDescProjectDelete = "CmdDescProjectDelete"
Expand All @@ -57,6 +66,8 @@ const (
CmdDescProjectImport = "CmdDescProjectImport"
CmdDescProjectImportLong = "CmdDescProjectImportLong"
ProjectImported = "ProjectImported"
NoYamlFound = "NoYamlFound"
ProjectImportFailed = "ProjectImportFailed"

// project service import
CmdHelpProjectServiceImport = "CmdHelpProjectServiceImport"
Expand Down
Loading