diff --git a/cmd/admin/v2/filesystem.go b/cmd/admin/v2/filesystem.go index 6f13aec..fbda5b1 100644 --- a/cmd/admin/v2/filesystem.go +++ b/cmd/admin/v2/filesystem.go @@ -28,8 +28,9 @@ func newFilesystemCmd(c *config.Config) *cobra.Command { cmdsConfig := &genericcli.CmdsConfig[*adminv2.FilesystemServiceCreateRequest, *adminv2.FilesystemServiceUpdateRequest, *apiv2.FilesystemLayout]{ BinaryName: config.BinaryName, GenericCLI: genericcli.NewGenericCLI(w).WithFS(c.Fs), - Singular: "filesystem", - Plural: "filesystems", + Singular: "filesystemlayout", + Plural: "filesystemlayouts", + Aliases: []string{"fsl"}, Description: "manage filesystem layouts which define how disks, raid arrays and volumes are set up on machines during installation", Sorter: sorters.FilesystemSorter(), DescribePrinter: func() printers.Printer { return c.DescribePrinter }, diff --git a/cmd/admin/v2/network.go b/cmd/admin/v2/network.go index e924374..3ca7662 100644 --- a/cmd/admin/v2/network.go +++ b/cmd/admin/v2/network.go @@ -205,6 +205,7 @@ func (c *networkCmd) Create(rq *adminv2.NetworkServiceCreateRequest) (*apiv2.Net if errorutil.IsConflict(err) { return nil, genericcli.AlreadyExistsError() } + return nil, err } @@ -223,13 +224,13 @@ func (c *networkCmd) Update(rq *adminv2.NetworkServiceUpdateRequest) (*apiv2.Net return resp.Network, nil } -func (c *networkCmd) Convert(r *apiv2.Network) (string, *adminv2.NetworkServiceCreateRequest, *adminv2.NetworkServiceUpdateRequest, error) { - addressFamily, err := helpers.AddressFamilyFromPrefixes(r.Prefixes...) +func (c *networkCmd) Convert(n *apiv2.Network) (string, *adminv2.NetworkServiceCreateRequest, *adminv2.NetworkServiceUpdateRequest, error) { + addressFamily, err := helpers.AddressFamilyFromPrefixes(n) if err != nil { return "", nil, nil, err } - return r.Id, networkResponseToCreate(r, addressFamily), networkResponseToUpdate(r), nil + return n.Id, networkResponseToCreate(n, addressFamily), networkResponseToUpdate(n), nil } func networkResponseToCreate(r *apiv2.Network, addressFamily *apiv2.NetworkAddressFamily) *adminv2.NetworkServiceCreateRequest { diff --git a/cmd/admin/v2/partition.go b/cmd/admin/v2/partition.go index 1fa3a1a..df401cf 100644 --- a/cmd/admin/v2/partition.go +++ b/cmd/admin/v2/partition.go @@ -5,6 +5,7 @@ import ( "sort" "strings" + "github.com/metal-stack/api/go/errorutil" adminv2 "github.com/metal-stack/api/go/metalstack/admin/v2" apiv2 "github.com/metal-stack/api/go/metalstack/api/v2" "github.com/metal-stack/cli/cmd/config" @@ -48,14 +49,6 @@ func newPartitionCmd(c *config.Config) *cobra.Command { ListPrinter: func() printers.Printer { return c.ListPrinter }, ValidArgsFn: c.Completion.Partition, Sorter: sorters.PartitionSorter(), - OnlyCmds: genericcli.OnlyCmds( - genericcli.DescribeCmd, - genericcli.ListCmd, - genericcli.CreateCmd, - genericcli.UpdateCmd, - genericcli.DeleteCmd, - genericcli.EditCmd, - ), CreateCmdMutateFn: func(cmd *cobra.Command) { cmd.Flags().String("id", "", "the id of the partition to create") addMutableFlags(cmd) @@ -173,7 +166,11 @@ func (c *partition) Create(rq *adminv2.PartitionServiceCreateRequest) (*apiv2.Pa resp, err := c.c.Client.Adminv2().Partition().Create(ctx, rq) if err != nil { - return nil, fmt.Errorf("failed to create partition: %w", err) + if errorutil.IsConflict(err) { + return nil, genericcli.AlreadyExistsError() + } + + return nil, err } return resp.Partition, nil diff --git a/cmd/admin/v2/project.go b/cmd/admin/v2/project.go index 5ca54f0..62fc235 100644 --- a/cmd/admin/v2/project.go +++ b/cmd/admin/v2/project.go @@ -3,6 +3,7 @@ package v2 import ( "fmt" + "github.com/metal-stack/api/go/errorutil" adminv2 "github.com/metal-stack/api/go/metalstack/admin/v2" apiv2 "github.com/metal-stack/api/go/metalstack/api/v2" "github.com/metal-stack/cli/cmd/config" @@ -24,7 +25,7 @@ func newProjectCmd(c *config.Config) *cobra.Command { c: c, } - cmdsConfig := &genericcli.CmdsConfig[*apiv2.ProjectServiceCreateRequest, *apiv2.ProjectServiceUpdateRequest, *apiv2.Project]{ + cmdsConfig := &genericcli.CmdsConfig[*adminv2.ProjectServiceCreateRequest, *apiv2.ProjectServiceUpdateRequest, *apiv2.Project]{ BinaryName: config.BinaryName, GenericCLI: genericcli.NewGenericCLI(w).WithFS(c.Fs), Singular: "project", @@ -39,11 +40,23 @@ func newProjectCmd(c *config.Config) *cobra.Command { }, } - return genericcli.NewCmds(cmdsConfig) + return genericcli.NewCmds(cmdsConfig, newProjectMemberCmd(c)) } func (c *project) Get(id string) (*apiv2.Project, error) { - panic("unimplemented") + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + req := &apiv2.ProjectServiceGetRequest{ + Project: id, + } + + resp, err := c.c.Client.Apiv2().Project().Get(ctx, req) + if err != nil { + return nil, fmt.Errorf("failed to get project: %w", err) + } + + return resp.GetProject(), nil } func (c *project) List() ([]*apiv2.Project, error) { @@ -73,18 +86,64 @@ func (c *project) List() ([]*apiv2.Project, error) { return resp.GetProjects(), nil } -func (c *project) Create(rq *apiv2.ProjectServiceCreateRequest) (*apiv2.Project, error) { - panic("unimplemented") +func (c *project) Create(rq *adminv2.ProjectServiceCreateRequest) (*apiv2.Project, error) { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + resp, err := c.c.Client.Adminv2().Project().Create(ctx, rq) + if err != nil { + if errorutil.IsConflict(err) { + return nil, genericcli.AlreadyExistsError() + } + + return nil, err + } + + return resp.Project, nil } func (c *project) Delete(id string) (*apiv2.Project, error) { - panic("unimplemented") + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + resp, err := c.c.Client.Apiv2().Project().Delete(ctx, &apiv2.ProjectServiceDeleteRequest{ + Project: id, + }) + if err != nil { + return nil, fmt.Errorf("failed to delete project: %w", err) + } + + return resp.Project, nil } -func (c *project) Convert(r *apiv2.Project) (string, *apiv2.ProjectServiceCreateRequest, *apiv2.ProjectServiceUpdateRequest, error) { - panic("unimplemented") +func (c *project) Convert(r *apiv2.Project) (string, *adminv2.ProjectServiceCreateRequest, *apiv2.ProjectServiceUpdateRequest, error) { + return r.Uuid, &adminv2.ProjectServiceCreateRequest{ + Id: pointer.PointerOrNil(r.Uuid), + Project: &apiv2.ProjectServiceCreateRequest{ + Login: r.Tenant, + Name: r.Name, + Description: r.Description, + AvatarUrl: r.AvatarUrl, + Labels: pointer.SafeDeref(r.Meta).Labels, + }, + }, &apiv2.ProjectServiceUpdateRequest{ + Project: r.Uuid, + Name: pointer.PointerOrNil(r.Name), + Description: pointer.PointerOrNil(r.Description), + AvatarUrl: r.AvatarUrl, + UpdateMeta: helpers.UpdateMetaFromMeta(r.Meta), + Labels: helpers.UpdateLabelsFromMeta(r.Meta), + }, nil } func (c *project) Update(rq *apiv2.ProjectServiceUpdateRequest) (*apiv2.Project, error) { - panic("unimplemented") + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + resp, err := c.c.Client.Apiv2().Project().Update(ctx, rq) + if err != nil { + return nil, fmt.Errorf("failed to update project: %w", err) + } + + return resp.Project, nil } diff --git a/cmd/admin/v2/project_member.go b/cmd/admin/v2/project_member.go new file mode 100644 index 0000000..6d1ff6d --- /dev/null +++ b/cmd/admin/v2/project_member.go @@ -0,0 +1,197 @@ +package v2 + +import ( + "fmt" + + "github.com/metal-stack/api/go/errorutil" + adminv2 "github.com/metal-stack/api/go/metalstack/admin/v2" + apiv2 "github.com/metal-stack/api/go/metalstack/api/v2" + + "github.com/metal-stack/cli/cmd/config" + "github.com/metal-stack/cli/cmd/sorters" + "github.com/metal-stack/cli/pkg/helpers" + "github.com/metal-stack/metal-lib/pkg/genericcli" + "github.com/metal-stack/metal-lib/pkg/genericcli/printers" + "github.com/metal-stack/metal-lib/pkg/pointer" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +type projectMember struct { + c *config.Config +} + +func newProjectMemberCmd(c *config.Config) *cobra.Command { + w := &projectMember{ + c: c, + } + + cmdsConfig := &genericcli.CmdsConfig[*adminv2.ProjectServiceAddMemberRequest, *apiv2.ProjectMemberServiceUpdateRequest, *apiv2.ProjectMember]{ + BinaryName: config.BinaryName, + GenericCLI: genericcli.NewGenericCLI(w).WithFS(c.Fs), + Singular: "member", + Plural: "members", + Description: "manage api project members", + Sorter: sorters.ProjectMemberSorter(), + DescribePrinter: func() printers.Printer { return c.DescribePrinter }, + ListPrinter: func() printers.Printer { return c.ListPrinter }, + DescribeCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("project", "", "the project to describe the project members of, defaults to project of the default project") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("project", c.Completion.Project)) + }, + ListCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("project", "", "the project to list the project members of, defaults to project of the default project") + cmd.Flags().String("role", "", "the role of the member") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("project", c.Completion.Project)) + genericcli.Must(cmd.RegisterFlagCompletionFunc("role", c.Completion.ProjectRole)) + }, + CreateCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("project", "", "the project for which to create a project member, defaults to project of the default project") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("project", c.Completion.Project)) + }, + UpdateCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("project", "", "the project for which to update a project member, defaults to project of the default project") + cmd.Flags().String("role", "", "the role of the member") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("project", c.Completion.Project)) + genericcli.Must(cmd.RegisterFlagCompletionFunc("role", c.Completion.ProjectRole)) + }, + DeleteCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("project", "", "the project from which to delete a project member, defaults to project of the default project") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("project", c.Completion.Project)) + }, + EditCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("project", "", "the project from which to edit a project member, defaults to project of the default project") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("project", c.Completion.Project)) + }, + CreateRequestFromCLI: w.createRequestFromCLI, + UpdateRequestFromCLI: w.updateRequestFromCLI, + ValidArgsFn: w.c.Completion.ProjectMember, + } + + return genericcli.NewCmds(cmdsConfig) +} + +func (c *projectMember) Get(id string) (*apiv2.ProjectMember, error) { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + project := c.c.GetProject() + + resp, err := c.c.Client.Apiv2().ProjectMember().Get(ctx, &apiv2.ProjectMemberServiceGetRequest{ + Project: project, + Member: id, + }) + if err != nil { + return nil, err + } + + return resp.Member, nil +} + +func (c *projectMember) List() ([]*apiv2.ProjectMember, error) { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + project := c.c.GetProject() + + resp, err := c.c.Client.Apiv2().ProjectMember().List(ctx, &apiv2.ProjectMemberServiceListRequest{ + Project: project, + }) + if err != nil { + return nil, err + } + + return resp.Members, nil +} + +func (c *projectMember) Create(rq *adminv2.ProjectServiceAddMemberRequest) (*apiv2.ProjectMember, error) { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + resp, err := c.c.Client.Adminv2().Project().AddMember(ctx, rq) + if err != nil { + if errorutil.IsConflict(err) { + return nil, genericcli.AlreadyExistsError() + } + + return nil, err + } + + return resp.Member, nil +} + +func (c *projectMember) Delete(id string) (*apiv2.ProjectMember, error) { + project := c.c.GetProject() + + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + resp, err := c.c.Client.Apiv2().ProjectMember().Delete(ctx, &apiv2.ProjectMemberServiceDeleteRequest{ + Project: project, + Member: id, + }) + if err != nil { + return nil, fmt.Errorf("failed to remove member from project: %w", err) + } + + return resp.Member, nil +} + +func (c *projectMember) Convert(r *apiv2.ProjectMember) (string, *adminv2.ProjectServiceAddMemberRequest, *apiv2.ProjectMemberServiceUpdateRequest, error) { + return r.Member, &adminv2.ProjectServiceAddMemberRequest{ + Project: r.Project, + Member: r.Member, + Role: r.Role, + }, + &apiv2.ProjectMemberServiceUpdateRequest{ + Project: r.Project, + Member: r.Member, + Role: pointer.PointerOrNil(r.Role), + UpdateMeta: helpers.UpdateMetaFromMeta(r.Meta), + Labels: helpers.UpdateLabelsFromMeta(r.Meta), + }, + nil +} + +func (c *projectMember) Update(rq *apiv2.ProjectMemberServiceUpdateRequest) (*apiv2.ProjectMember, error) { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + resp, err := c.c.Client.Apiv2().ProjectMember().Update(ctx, rq) + if err != nil { + return nil, fmt.Errorf("failed to update member: %w", err) + } + + return resp.Member, nil +} + +func (c *projectMember) updateRequestFromCLI(args []string) (*apiv2.ProjectMemberServiceUpdateRequest, error) { + member, err := genericcli.GetExactlyOneArg(args) + if err != nil { + return nil, err + } + + project := c.c.GetProject() + + return &apiv2.ProjectMemberServiceUpdateRequest{ + Project: project, + Member: member, + Role: pointer.PointerOrNil(apiv2.ProjectRole(apiv2.ProjectRole_value[viper.GetString("role")])), + }, nil +} + +func (c *projectMember) createRequestFromCLI() (*adminv2.ProjectServiceAddMemberRequest, error) { + project := c.c.GetProject() + + return &adminv2.ProjectServiceAddMemberRequest{ + Project: project, + Member: viper.GetString("id"), + Role: apiv2.ProjectRole(apiv2.ProjectRole_value[viper.GetString("role")]), + }, nil +} diff --git a/cmd/admin/v2/tenant.go b/cmd/admin/v2/tenant.go index e8948c3..89c6801 100644 --- a/cmd/admin/v2/tenant.go +++ b/cmd/admin/v2/tenant.go @@ -25,7 +25,7 @@ func newTenantCmd(c *config.Config) *cobra.Command { c: c, } - cmdsConfig := &genericcli.CmdsConfig[*adminv2.TenantServiceCreateRequest, any, *apiv2.Tenant]{ + cmdsConfig := &genericcli.CmdsConfig[*adminv2.TenantServiceCreateRequest, *apiv2.TenantServiceUpdateRequest, *apiv2.Tenant]{ BinaryName: config.BinaryName, GenericCLI: genericcli.NewGenericCLI(w).WithFS(c.Fs), Singular: "tenant", @@ -41,6 +41,7 @@ func newTenantCmd(c *config.Config) *cobra.Command { cmd.Flags().StringSlice("labels", nil, "lists only tenant with the given labels") }, CreateCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("login", "", "the login id of the tenant to create") cmd.Flags().String("name", "", "the name of the tenant to create") cmd.Flags().String("description", "", "the description of the tenant to create") cmd.Flags().String("email", "", "the email of the tenant to create") @@ -48,21 +49,35 @@ func newTenantCmd(c *config.Config) *cobra.Command { }, CreateRequestFromCLI: func() (*adminv2.TenantServiceCreateRequest, error) { return &adminv2.TenantServiceCreateRequest{ - Name: viper.GetString("name"), - Description: pointer.PointerOrNil(viper.GetString("description")), - Email: pointer.PointerOrNil(viper.GetString("email")), - AvatarUrl: pointer.PointerOrNil(viper.GetString("avatar-url")), + Login: pointer.PointerOrNil(viper.GetString("login")), + Tenant: &apiv2.TenantServiceCreateRequest{ + Name: viper.GetString("name"), + Description: pointer.PointerOrNil(viper.GetString("description")), + Email: pointer.PointerOrNil(viper.GetString("email")), + AvatarUrl: pointer.PointerOrNil(viper.GetString("avatar-url")), + }, }, nil }, - OnlyCmds: genericcli.OnlyCmds(genericcli.ListCmd, genericcli.CreateCmd), ValidArgsFn: w.c.Completion.AdminTenant, } - return genericcli.NewCmds(cmdsConfig, newAddMemberCmd(c)) + return genericcli.NewCmds(cmdsConfig, newTenantMemberCmd(c)) } func (c *tenant) Get(id string) (*apiv2.Tenant, error) { - panic("unimplemented") + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + req := &apiv2.TenantServiceGetRequest{ + Login: id, + } + + resp, err := c.c.Client.Apiv2().Tenant().Get(ctx, req) + if err != nil { + return nil, fmt.Errorf("failed to get tenant: %w", err) + } + + return resp.GetTenant(), nil } func (c *tenant) List() ([]*apiv2.Tenant, error) { @@ -110,59 +125,50 @@ func (c *tenant) Create(rq *adminv2.TenantServiceCreateRequest) (*apiv2.Tenant, } func (c *tenant) Delete(id string) (*apiv2.Tenant, error) { - panic("unimplemented") -} + ctx, cancel := c.c.NewRequestContext() + defer cancel() -func (c *tenant) Convert(r *apiv2.Tenant) (string, *adminv2.TenantServiceCreateRequest, any, error) { - panic("unimplemented") -} + resp, err := c.c.Client.Apiv2().Tenant().Delete(ctx, &apiv2.TenantServiceDeleteRequest{ + Login: id, + }) + if err != nil { + return nil, fmt.Errorf("failed to delete tenant: %w", err) + } -func (c *tenant) Update(rq any) (*apiv2.Tenant, error) { - panic("unimplemented") + return resp.Tenant, nil } -func newAddMemberCmd(c *config.Config) *cobra.Command { - cmd := &cobra.Command{ - Use: "add-member", - Short: "Add a new member to a tenant", - Long: `Add a new member to an existing tenant by specifying the tenant ID, member's ID, and role.`, - RunE: func(cmd *cobra.Command, args []string) error { - ctx, cancel := c.NewRequestContext() - defer cancel() - - var ( - tenantId = viper.GetString("tenant-id") - memberId = viper.GetString("member-id") - memberRole = viper.GetString("role") - ) - - if tenantId == "" || memberId == "" || memberRole == "" { - return fmt.Errorf("tenant ID, member ID, and role must all be specified") - } - - _, err := c.Client.Adminv2().Tenant().AddMember(ctx, &adminv2.TenantServiceAddMemberRequest{ - Role: apiv2.TenantRole(apiv2.TenantRole_value[memberRole]), - Tenant: tenantId, - Member: memberId, - }) - if err != nil { - return fmt.Errorf("failed to add member to tenant: %w", err) - } - - return nil +func (c *tenant) Convert(r *apiv2.Tenant) (string, *adminv2.TenantServiceCreateRequest, *apiv2.TenantServiceUpdateRequest, error) { + return r.Login, &adminv2.TenantServiceCreateRequest{ + Login: pointer.PointerOrNil(r.Login), + Tenant: &apiv2.TenantServiceCreateRequest{ + Name: r.Name, + Description: pointer.PointerOrNil(r.Description), + Email: pointer.PointerOrNil(r.Email), + AvatarUrl: pointer.PointerOrNil(r.AvatarUrl), + Labels: pointer.SafeDeref(r.Meta).Labels, + }, }, - } + &apiv2.TenantServiceUpdateRequest{ + Login: r.Login, + Name: pointer.PointerOrNil(r.Name), + Email: pointer.PointerOrNil(r.Email), + Description: pointer.PointerOrNil(r.Description), + AvatarUrl: pointer.PointerOrNil(r.AvatarUrl), + UpdateMeta: helpers.UpdateMetaFromMeta(r.Meta), + Labels: helpers.UpdateLabelsFromMeta(r.Meta), + }, + nil +} - cmd.Flags().String("tenant-id", "", "ID of the tenant where the member is added") - cmd.Flags().String("member-id", "", "ID of the member to be added") - cmd.Flags().String("role", "", "Role of the member within the tenant") - genericcli.Must(cmd.MarkFlagRequired("tenant-id")) - genericcli.Must(cmd.MarkFlagRequired("member-id")) - genericcli.Must(cmd.MarkFlagRequired("role")) +func (c *tenant) Update(rq *apiv2.TenantServiceUpdateRequest) (*apiv2.Tenant, error) { + ctx, cancel := c.c.NewRequestContext() + defer cancel() - genericcli.Must(cmd.RegisterFlagCompletionFunc("tenant-id", c.Completion.AdminTenant)) - genericcli.Must(cmd.RegisterFlagCompletionFunc("member-id", c.Completion.AdminTenant)) - genericcli.Must(cmd.RegisterFlagCompletionFunc("role", c.Completion.TenantRole)) + resp, err := c.c.Client.Apiv2().Tenant().Update(ctx, rq) + if err != nil { + return nil, fmt.Errorf("failed to update tenant: %w", err) + } - return cmd + return resp.Tenant, nil } diff --git a/cmd/admin/v2/tenant_member.go b/cmd/admin/v2/tenant_member.go new file mode 100644 index 0000000..ce1168a --- /dev/null +++ b/cmd/admin/v2/tenant_member.go @@ -0,0 +1,212 @@ +package v2 + +import ( + "fmt" + + "github.com/metal-stack/api/go/errorutil" + adminv2 "github.com/metal-stack/api/go/metalstack/admin/v2" + apiv2 "github.com/metal-stack/api/go/metalstack/api/v2" + + "github.com/metal-stack/cli/cmd/config" + "github.com/metal-stack/cli/cmd/sorters" + "github.com/metal-stack/cli/pkg/helpers" + "github.com/metal-stack/metal-lib/pkg/genericcli" + "github.com/metal-stack/metal-lib/pkg/genericcli/printers" + "github.com/metal-stack/metal-lib/pkg/pointer" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +type tenantMember struct { + c *config.Config +} + +func newTenantMemberCmd(c *config.Config) *cobra.Command { + w := &tenantMember{ + c: c, + } + + cmdsConfig := &genericcli.CmdsConfig[*adminv2.TenantServiceAddMemberRequest, *apiv2.TenantMemberServiceUpdateRequest, *apiv2.TenantMember]{ + BinaryName: config.BinaryName, + GenericCLI: genericcli.NewGenericCLI(w).WithFS(c.Fs), + Singular: "member", + Plural: "members", + Description: "manage api tenant members", + Sorter: sorters.TenantMemberSorter(), + DescribePrinter: func() printers.Printer { return c.DescribePrinter }, + ListPrinter: func() printers.Printer { return c.ListPrinter }, + DescribeCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("tenant", "", "the tenant to describe the tenant members of, defaults to tenant of the default project") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("tenant", c.Completion.Tenant)) + }, + ListCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("tenant", "", "the tenant to list the tenant members of, defaults to tenant of the default project") + cmd.Flags().String("role", "", "the role of the member") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("tenant", c.Completion.Tenant)) + genericcli.Must(cmd.RegisterFlagCompletionFunc("role", c.Completion.TenantRole)) + }, + CreateCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("tenant", "", "the tenant for which to create a tenant member, defaults to tenant of the default project") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("tenant", c.Completion.Tenant)) + }, + UpdateCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("tenant", "", "the tenant for which to update a tenant member, defaults to tenant of the default project") + cmd.Flags().String("role", "", "the role of the member") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("tenant", c.Completion.Tenant)) + genericcli.Must(cmd.RegisterFlagCompletionFunc("role", c.Completion.TenantRole)) + + }, + DeleteCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("tenant", "", "the tenant from which to delete a tenant member, defaults to tenant of the default project") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("tenant", c.Completion.Tenant)) + }, + EditCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("tenant", "", "the tenant from which to edit a tenant member, defaults to tenant of the default project") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("tenant", c.Completion.Tenant)) + }, + CreateRequestFromCLI: w.createRequestFromCLI, + UpdateRequestFromCLI: w.updateRequestFromCLI, + ValidArgsFn: w.c.Completion.TenantMember, + } + + return genericcli.NewCmds(cmdsConfig) +} + +func (c *tenantMember) Get(id string) (*apiv2.TenantMember, error) { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + tenant, err := c.c.GetTenant() + if err != nil { + return nil, err + } + + resp, err := c.c.Client.Apiv2().TenantMember().Get(ctx, &apiv2.TenantMemberServiceGetRequest{ + Login: tenant, + }) + if err != nil { + return nil, err + } + + return resp.Member, nil +} + +func (c *tenantMember) List() ([]*apiv2.TenantMember, error) { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + tenant, err := c.c.GetTenant() + if err != nil { + return nil, err + } + + resp, err := c.c.Client.Apiv2().TenantMember().List(ctx, &apiv2.TenantMemberServiceListRequest{ + Login: tenant, + }) + if err != nil { + return nil, nil + } + + return resp.Members, nil +} + +func (c *tenantMember) Create(rq *adminv2.TenantServiceAddMemberRequest) (*apiv2.TenantMember, error) { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + resp, err := c.c.Client.Adminv2().Tenant().AddMember(ctx, rq) + if err != nil { + if errorutil.IsConflict(err) { + return nil, genericcli.AlreadyExistsError() + } + + return nil, err + } + + return resp.Member, nil +} + +func (c *tenantMember) Delete(id string) (*apiv2.TenantMember, error) { + tenant, err := c.c.GetTenant() + if err != nil { + return nil, err + } + + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + resp, err := c.c.Client.Apiv2().TenantMember().Delete(ctx, &apiv2.TenantMemberServiceDeleteRequest{ + Login: tenant, + Member: id, + }) + if err != nil { + return nil, fmt.Errorf("failed to remove member from tenant: %w", err) + } + + return resp.Member, nil +} + +func (c *tenantMember) Convert(r *apiv2.TenantMember) (string, *adminv2.TenantServiceAddMemberRequest, *apiv2.TenantMemberServiceUpdateRequest, error) { + return r.Member, &adminv2.TenantServiceAddMemberRequest{ + Tenant: r.Tenant, + Member: r.Member, + Role: r.Role, + }, + &apiv2.TenantMemberServiceUpdateRequest{ + Login: r.Tenant, + Member: r.Member, + Role: pointer.PointerOrNil(r.Role), + UpdateMeta: helpers.UpdateMetaFromMeta(r.Meta), + Labels: helpers.UpdateLabelsFromMeta(r.Meta), + }, + nil +} + +func (c *tenantMember) Update(rq *apiv2.TenantMemberServiceUpdateRequest) (*apiv2.TenantMember, error) { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + resp, err := c.c.Client.Apiv2().TenantMember().Update(ctx, rq) + if err != nil { + return nil, fmt.Errorf("failed to update member: %w", err) + } + + return resp.Member, nil +} + +func (c *tenantMember) updateRequestFromCLI(args []string) (*apiv2.TenantMemberServiceUpdateRequest, error) { + member, err := genericcli.GetExactlyOneArg(args) + if err != nil { + return nil, err + } + + tenant, err := c.c.GetTenant() + if err != nil { + return nil, err + } + + return &apiv2.TenantMemberServiceUpdateRequest{ + Login: tenant, + Member: member, + Role: pointer.PointerOrNil(apiv2.TenantRole(apiv2.TenantRole_value[viper.GetString("role")])), + }, nil +} + +func (c *tenantMember) createRequestFromCLI() (*adminv2.TenantServiceAddMemberRequest, error) { + tenant, err := c.c.GetTenant() + if err != nil { + return nil, err + } + + return &adminv2.TenantServiceAddMemberRequest{ + Tenant: tenant, + Member: viper.GetString("id"), + Role: apiv2.TenantRole(apiv2.TenantRole_value[viper.GetString("role")]), + }, nil +} diff --git a/cmd/api/v2/filesystem.go b/cmd/api/v2/filesystem.go index 4de5032..f9922bc 100644 --- a/cmd/api/v2/filesystem.go +++ b/cmd/api/v2/filesystem.go @@ -25,8 +25,9 @@ func newFilesystemCmd(c *config.Config) *cobra.Command { cmdsConfig := &genericcli.CmdsConfig[any, any, *apiv2.FilesystemLayout]{ BinaryName: config.BinaryName, GenericCLI: genericcli.NewGenericCLI(w).WithFS(c.Fs), - Singular: "filesystem", - Plural: "filesystems", + Singular: "filesystemlayout", + Plural: "filesystemlayouts", + Aliases: []string{"fsl"}, Description: "a filesystem layout defines how disks, raid arrays and volumes are set up on a machine during installation", Sorter: sorters.FilesystemSorter(), OnlyCmds: genericcli.OnlyCmds(genericcli.ListCmd, genericcli.DescribeCmd), diff --git a/cmd/api/v2/network.go b/cmd/api/v2/network.go index 392145d..6b44873 100644 --- a/cmd/api/v2/network.go +++ b/cmd/api/v2/network.go @@ -218,13 +218,13 @@ func (c *networkCmd) Update(rq *apiv2.NetworkServiceUpdateRequest) (*apiv2.Netwo return resp.Network, nil } -func (c *networkCmd) Convert(r *apiv2.Network) (string, *apiv2.NetworkServiceCreateRequest, *apiv2.NetworkServiceUpdateRequest, error) { - addressFamily, err := helpers.AddressFamilyFromPrefixes(r.Prefixes...) +func (c *networkCmd) Convert(n *apiv2.Network) (string, *apiv2.NetworkServiceCreateRequest, *apiv2.NetworkServiceUpdateRequest, error) { + addressFamily, err := helpers.AddressFamilyFromPrefixes(n) if err != nil { return "", nil, nil, err } - return helpers.EncodeProject(r.Id, pointer.SafeDeref(r.Project)), networkResponseToCreate(r, addressFamily), networkResponseToUpdate(r), nil + return helpers.EncodeProject(n.Id, pointer.SafeDeref(n.Project)), networkResponseToCreate(n, addressFamily), networkResponseToUpdate(n), nil } func networkResponseToCreate(r *apiv2.Network, addressFamily *apiv2.NetworkAddressFamily) *apiv2.NetworkServiceCreateRequest { diff --git a/cmd/api/v2/project.go b/cmd/api/v2/project.go index 2f4f398..f9b8dd8 100644 --- a/cmd/api/v2/project.go +++ b/cmd/api/v2/project.go @@ -114,57 +114,7 @@ func newProjectCmd(c *config.Config) *cobra.Command { inviteCmd.AddCommand(generateInviteCmd, deleteInviteCmd, listInvitesCmd, joinProjectCmd) - memberCmd := &cobra.Command{ - Use: "member", - Aliases: []string{"members"}, - Short: "manage project members", - } - - listMembersCmd := &cobra.Command{ - Use: "list", - Aliases: []string{"ls"}, - Short: "lists members of a project", - RunE: func(cmd *cobra.Command, args []string) error { - return w.listMembers() - }, - } - - listMembersCmd.Flags().StringP("project", "p", "", "the project of which to list the members") - - genericcli.AddSortFlag(listMembersCmd, sorters.ProjectMemberSorter()) - - removeMemberCmd := &cobra.Command{ - Use: "delete ", - Aliases: []string{"destroy", "rm", "remove"}, - Short: "remove member from a project", - RunE: func(cmd *cobra.Command, args []string) error { - return w.removeMember(args) - }, - ValidArgsFunction: c.Completion.ProjectMember, - } - - removeMemberCmd.Flags().StringP("project", "p", "", "the project in which to remove the member") - - genericcli.Must(removeMemberCmd.RegisterFlagCompletionFunc("project", c.Completion.Project)) - - updateMemberCmd := &cobra.Command{ - Use: "update ", - Short: "update member from a project", - RunE: func(cmd *cobra.Command, args []string) error { - return w.updateMember(args) - }, - ValidArgsFunction: c.Completion.ProjectMember, - } - - updateMemberCmd.Flags().StringP("project", "p", "", "the project in which to remove the member") - updateMemberCmd.Flags().String("role", "", "the role of the member") - - genericcli.Must(updateMemberCmd.RegisterFlagCompletionFunc("project", c.Completion.Project)) - genericcli.Must(updateMemberCmd.RegisterFlagCompletionFunc("role", c.Completion.ProjectRole)) - - memberCmd.AddCommand(removeMemberCmd, updateMemberCmd, listMembersCmd) - - return genericcli.NewCmds(cmdsConfig, joinProjectCmd, inviteCmd, memberCmd) + return genericcli.NewCmds(cmdsConfig, joinProjectCmd, inviteCmd, newProjectMemberCmd(c)) } func (c *project) Get(id string) (*apiv2.Project, error) { @@ -223,6 +173,7 @@ func (c *project) Create(rq *apiv2.ProjectServiceCreateRequest) (*apiv2.Project, return nil, err } + return resp.Project, nil } @@ -245,10 +196,15 @@ func (c *project) Convert(r *apiv2.Project) (string, *apiv2.ProjectServiceCreate Login: r.Tenant, Name: r.Name, Description: r.Description, + AvatarUrl: r.AvatarUrl, + Labels: pointer.SafeDeref(r.Meta).Labels, }, &apiv2.ProjectServiceUpdateRequest{ Project: r.Uuid, - Name: new(r.Name), - Description: new(r.Description), + Name: pointer.PointerOrNil(r.Name), + Description: pointer.PointerOrNil(r.Description), + AvatarUrl: r.AvatarUrl, + UpdateMeta: helpers.UpdateMetaFromMeta(r.Meta), + Labels: helpers.UpdateLabelsFromMeta(r.Meta), }, nil } @@ -409,66 +365,3 @@ func (c *project) deleteInvite(args []string) error { return nil } - -func (c *project) removeMember(args []string) error { - member, err := genericcli.GetExactlyOneArg(args) - if err != nil { - return err - } - - ctx, cancel := c.c.NewRequestContext() - defer cancel() - - _, err = c.c.Client.Apiv2().Project().RemoveMember(ctx, &apiv2.ProjectServiceRemoveMemberRequest{ - Project: c.c.GetProject(), - Member: member, - }) - if err != nil { - return fmt.Errorf("failed to remove member from project: %w", err) - } - - _, _ = fmt.Fprintf(c.c.Out, "%s successfully removed member %q\n", color.GreenString("✔"), member) - - return nil -} - -func (c *project) updateMember(args []string) error { - member, err := genericcli.GetExactlyOneArg(args) - if err != nil { - return err - } - - ctx, cancel := c.c.NewRequestContext() - defer cancel() - - resp, err := c.c.Client.Apiv2().Project().UpdateMember(ctx, &apiv2.ProjectServiceUpdateMemberRequest{ - Project: c.c.GetProject(), - Member: member, - Role: apiv2.ProjectRole(apiv2.ProjectRole_value[viper.GetString("role")]), - }) - if err != nil { - return fmt.Errorf("failed to update member: %w", err) - } - - return c.c.DescribePrinter.Print(resp.GetProjectMember()) -} - -func (c *project) listMembers() error { - ctx, cancel := c.c.NewRequestContext() - defer cancel() - - resp, err := c.c.Client.Apiv2().Project().Get(ctx, &apiv2.ProjectServiceGetRequest{ - Project: c.c.GetProject(), - }) - if err != nil { - return fmt.Errorf("failed to get project: %w", err) - } - - members := resp.GetProjectMembers() - - if err := sorters.ProjectMemberSorter().SortBy(members); err != nil { - return err - } - - return c.c.ListPrinter.Print(members) -} diff --git a/cmd/api/v2/project_member.go b/cmd/api/v2/project_member.go new file mode 100644 index 0000000..1b39eca --- /dev/null +++ b/cmd/api/v2/project_member.go @@ -0,0 +1,221 @@ +package v2 + +import ( + "fmt" + + "github.com/metal-stack/api/go/errorutil" + apiv2 "github.com/metal-stack/api/go/metalstack/api/v2" + + "github.com/metal-stack/cli/cmd/config" + "github.com/metal-stack/cli/cmd/sorters" + "github.com/metal-stack/cli/pkg/helpers" + "github.com/metal-stack/metal-lib/pkg/genericcli" + "github.com/metal-stack/metal-lib/pkg/genericcli/printers" + "github.com/metal-stack/metal-lib/pkg/pointer" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +type projectMember struct { + c *config.Config +} + +func newProjectMemberCmd(c *config.Config) *cobra.Command { + w := &projectMember{ + c: c, + } + + cmdsConfig := &genericcli.CmdsConfig[*apiv2.ProjectMemberServiceCreateRequest, *apiv2.ProjectMemberServiceUpdateRequest, *apiv2.ProjectMember]{ + BinaryName: config.BinaryName, + GenericCLI: genericcli.NewGenericCLI(w).WithFS(c.Fs), + Singular: "member", + Plural: "members", + Description: "manage api project members", + Sorter: sorters.ProjectMemberSorter(), + DescribePrinter: func() printers.Printer { return c.DescribePrinter }, + ListPrinter: func() printers.Printer { return c.ListPrinter }, + DescribeCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("project", "", "the project to describe the project members of, defaults to project of the default project") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("project", c.Completion.Project)) + }, + ListCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("project", "", "the project to list the project members of, defaults to project of the default project") + cmd.Flags().String("role", "", "the role of the member") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("project", c.Completion.Project)) + genericcli.Must(cmd.RegisterFlagCompletionFunc("role", c.Completion.ProjectRole)) + }, + CreateCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("project", "", "the project for which to create a project member, defaults to project of the default project") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("project", c.Completion.Project)) + }, + UpdateCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("project", "", "the project for which to update a project member, defaults to project of the default project") + cmd.Flags().String("role", "", "the role of the member") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("project", c.Completion.Project)) + genericcli.Must(cmd.RegisterFlagCompletionFunc("role", c.Completion.ProjectRole)) + }, + DeleteCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("project", "", "the project from which to delete a project member, defaults to project of the default project") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("project", c.Completion.Project)) + }, + EditCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("project", "", "the project from which to edit a project member, defaults to project of the default project") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("project", c.Completion.Project)) + }, + CreateRequestFromCLI: w.createRequestFromCLI, + UpdateRequestFromCLI: w.updateRequestFromCLI, + ValidArgsFn: w.c.Completion.ProjectMember, + } + + leaveCmd := &cobra.Command{ + Use: "leave", + Short: "leave the given project", + RunE: func(cmd *cobra.Command, _ []string) error { + return w.leave() + }, + } + leaveCmd.Flags().String("project", "", "the project to leave, defaults to project of the default project") + genericcli.Must(leaveCmd.RegisterFlagCompletionFunc("project", c.Completion.Project)) + + return genericcli.NewCmds(cmdsConfig, leaveCmd) +} + +func (c *projectMember) Get(id string) (*apiv2.ProjectMember, error) { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + project := c.c.GetProject() + + resp, err := c.c.Client.Apiv2().ProjectMember().Get(ctx, &apiv2.ProjectMemberServiceGetRequest{ + Project: project, + Member: id, + }) + if err != nil { + return nil, err + } + + return resp.Member, nil +} + +func (c *projectMember) List() ([]*apiv2.ProjectMember, error) { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + project := c.c.GetProject() + + resp, err := c.c.Client.Apiv2().ProjectMember().List(ctx, &apiv2.ProjectMemberServiceListRequest{ + Project: project, + }) + if err != nil { + return nil, err + } + + return resp.Members, nil +} + +func (c *projectMember) Create(rq *apiv2.ProjectMemberServiceCreateRequest) (*apiv2.ProjectMember, error) { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + resp, err := c.c.Client.Apiv2().ProjectMember().Create(ctx, rq) + if err != nil { + if errorutil.IsConflict(err) { + return nil, genericcli.AlreadyExistsError() + } + + return nil, err + } + + return resp.Member, nil +} + +func (c *projectMember) Delete(id string) (*apiv2.ProjectMember, error) { + project := c.c.GetProject() + + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + resp, err := c.c.Client.Apiv2().ProjectMember().Delete(ctx, &apiv2.ProjectMemberServiceDeleteRequest{ + Project: project, + Member: id, + }) + if err != nil { + return nil, fmt.Errorf("failed to remove member from project: %w", err) + } + + return resp.Member, nil +} + +func (c *projectMember) Convert(r *apiv2.ProjectMember) (string, *apiv2.ProjectMemberServiceCreateRequest, *apiv2.ProjectMemberServiceUpdateRequest, error) { + return r.Member, &apiv2.ProjectMemberServiceCreateRequest{ + Project: r.Project, + Member: r.Member, + Role: r.Role, + Labels: pointer.SafeDeref(r.Meta).Labels, + }, + &apiv2.ProjectMemberServiceUpdateRequest{ + Project: r.Project, + Member: r.Member, + Role: pointer.PointerOrNil(r.Role), + UpdateMeta: helpers.UpdateMetaFromMeta(r.Meta), + Labels: helpers.UpdateLabelsFromMeta(r.Meta), + }, + nil +} + +func (c *projectMember) Update(rq *apiv2.ProjectMemberServiceUpdateRequest) (*apiv2.ProjectMember, error) { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + resp, err := c.c.Client.Apiv2().ProjectMember().Update(ctx, rq) + if err != nil { + return nil, fmt.Errorf("failed to update member: %w", err) + } + + return resp.Member, nil +} + +func (c *projectMember) updateRequestFromCLI(args []string) (*apiv2.ProjectMemberServiceUpdateRequest, error) { + member, err := genericcli.GetExactlyOneArg(args) + if err != nil { + return nil, err + } + + project := c.c.GetProject() + + return &apiv2.ProjectMemberServiceUpdateRequest{ + Project: project, + Member: member, + Role: pointer.PointerOrNil(apiv2.ProjectRole(apiv2.ProjectRole_value[viper.GetString("role")])), + }, nil +} + +func (c *projectMember) createRequestFromCLI() (*apiv2.ProjectMemberServiceCreateRequest, error) { + project := c.c.GetProject() + + return &apiv2.ProjectMemberServiceCreateRequest{ + Project: project, + Member: viper.GetString("id"), + Role: apiv2.ProjectRole(apiv2.ProjectRole_value[viper.GetString("role")]), + }, nil +} + +func (c *projectMember) leave() error { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + resp, err := c.c.Client.Apiv2().ProjectMember().Leave(ctx, &apiv2.ProjectMemberServiceLeaveRequest{ + Project: c.c.GetProject(), + }) + if err != nil { + return fmt.Errorf("failed to leave project: %w", err) + } + + return c.c.DescribePrinter.Print(resp.Member) +} diff --git a/cmd/api/v2/tenant.go b/cmd/api/v2/tenant.go index 2ffbef4..345b03a 100644 --- a/cmd/api/v2/tenant.go +++ b/cmd/api/v2/tenant.go @@ -111,59 +111,9 @@ func newTenantCmd(c *config.Config) *cobra.Command { }, } - memberCmd := &cobra.Command{ - Use: "member", - Aliases: []string{"members"}, - Short: "manage tenant members", - } - - listMembersCmd := &cobra.Command{ - Use: "list", - Aliases: []string{"ls"}, - Short: "lists members of a tenant", - RunE: func(cmd *cobra.Command, args []string) error { - return w.listMembers() - }, - } - - listMembersCmd.Flags().String("tenant", "", "the tenant in which to remove the member") - - genericcli.AddSortFlag(listMembersCmd, sorters.TenantMemberSorter()) - - removeMemberCmd := &cobra.Command{ - Use: "remove ", - Short: "remove member from a tenant", - Aliases: []string{"destroy", "rm", "remove"}, - RunE: func(cmd *cobra.Command, args []string) error { - return w.removeMember(args) - }, - ValidArgsFunction: c.Completion.TenantMember, - } - - removeMemberCmd.Flags().String("tenant", "", "the tenant in which to remove the member") - - genericcli.Must(removeMemberCmd.RegisterFlagCompletionFunc("tenant", c.Completion.Tenant)) - - updateMemberCmd := &cobra.Command{ - Use: "update ", - Short: "update member from a tenant", - RunE: func(cmd *cobra.Command, args []string) error { - return w.updateMember(args) - }, - ValidArgsFunction: c.Completion.TenantMember, - } - - updateMemberCmd.Flags().String("tenant", "", "the tenant in which to remove the member") - updateMemberCmd.Flags().String("role", "", "the role of the member") - - genericcli.Must(updateMemberCmd.RegisterFlagCompletionFunc("tenant", c.Completion.Tenant)) - genericcli.Must(updateMemberCmd.RegisterFlagCompletionFunc("role", c.Completion.TenantRole)) - - memberCmd.AddCommand(removeMemberCmd, updateMemberCmd, listMembersCmd) - inviteCmd.AddCommand(generateInviteCmd, deleteInviteCmd, listInvitesCmd, joinTenantCmd) - return genericcli.NewCmds(cmdsConfig, joinTenantCmd, inviteCmd, memberCmd) + return genericcli.NewCmds(cmdsConfig, joinTenantCmd, inviteCmd, newTenantMemberCmd(c)) } func (c *tenant) Get(id string) (*apiv2.Tenant, error) { @@ -241,12 +191,12 @@ func (c *tenant) Delete(id string) (*apiv2.Tenant, error) { } func (c *tenant) Convert(r *apiv2.Tenant) (string, *apiv2.TenantServiceCreateRequest, *apiv2.TenantServiceUpdateRequest, error) { - return r.Login, &apiv2.TenantServiceCreateRequest{ Name: r.Name, - Description: &r.Description, - Email: &r.Email, - AvatarUrl: &r.AvatarUrl, + Description: pointer.PointerOrNil(r.Description), + Email: pointer.PointerOrNil(r.Email), + AvatarUrl: pointer.PointerOrNil(r.AvatarUrl), + Labels: pointer.SafeDeref(r.Meta).Labels, }, &apiv2.TenantServiceUpdateRequest{ Login: r.Login, @@ -254,6 +204,8 @@ func (c *tenant) Convert(r *apiv2.Tenant) (string, *apiv2.TenantServiceCreateReq Email: pointer.PointerOrNil(r.Email), Description: pointer.PointerOrNil(r.Description), AvatarUrl: pointer.PointerOrNil(r.AvatarUrl), + UpdateMeta: helpers.UpdateMetaFromMeta(r.Meta), + Labels: helpers.UpdateLabelsFromMeta(r.Meta), }, nil } @@ -399,81 +351,3 @@ func (c *tenant) deleteInvite(args []string) error { return nil } - -func (c *tenant) removeMember(args []string) error { - member, err := genericcli.GetExactlyOneArg(args) - if err != nil { - return err - } - - tenant, err := c.c.GetTenant() - if err != nil { - return err - } - - ctx, cancel := c.c.NewRequestContext() - defer cancel() - - _, err = c.c.Client.Apiv2().Tenant().RemoveMember(ctx, &apiv2.TenantServiceRemoveMemberRequest{ - Login: tenant, - Member: member, - }) - if err != nil { - return fmt.Errorf("failed to remove member from tenant: %w", err) - } - - _, _ = fmt.Fprintf(c.c.Out, "%s successfully removed member %q\n", color.GreenString("✔"), member) - - return nil -} - -func (c *tenant) updateMember(args []string) error { - member, err := genericcli.GetExactlyOneArg(args) - if err != nil { - return err - } - - tenant, err := c.c.GetTenant() - if err != nil { - return err - } - - ctx, cancel := c.c.NewRequestContext() - defer cancel() - - resp, err := c.c.Client.Apiv2().Tenant().UpdateMember(ctx, &apiv2.TenantServiceUpdateMemberRequest{ - Login: tenant, - Member: member, - Role: apiv2.TenantRole(apiv2.TenantRole_value[viper.GetString("role")]), - }) - if err != nil { - return fmt.Errorf("failed to update member: %w", err) - } - - return c.c.DescribePrinter.Print(resp.GetTenantMember()) -} - -func (c *tenant) listMembers() error { - ctx, cancel := c.c.NewRequestContext() - defer cancel() - - tenant, err := c.c.GetTenant() - if err != nil { - return err - } - - resp, err := c.c.Client.Apiv2().Tenant().Get(ctx, &apiv2.TenantServiceGetRequest{ - Login: tenant, - }) - if err != nil { - return fmt.Errorf("failed to get tenant: %w", err) - } - - members := resp.GetTenantMembers() - - if err := sorters.TenantMemberSorter().SortBy(members); err != nil { - return err - } - - return c.c.ListPrinter.Print(members) -} diff --git a/cmd/api/v2/tenant_member.go b/cmd/api/v2/tenant_member.go new file mode 100644 index 0000000..09cab79 --- /dev/null +++ b/cmd/api/v2/tenant_member.go @@ -0,0 +1,241 @@ +package v2 + +import ( + "fmt" + + "github.com/metal-stack/api/go/errorutil" + apiv2 "github.com/metal-stack/api/go/metalstack/api/v2" + + "github.com/metal-stack/cli/cmd/config" + "github.com/metal-stack/cli/cmd/sorters" + "github.com/metal-stack/cli/pkg/helpers" + "github.com/metal-stack/metal-lib/pkg/genericcli" + "github.com/metal-stack/metal-lib/pkg/genericcli/printers" + "github.com/metal-stack/metal-lib/pkg/pointer" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +type tenantMember struct { + c *config.Config +} + +func newTenantMemberCmd(c *config.Config) *cobra.Command { + w := &tenantMember{ + c: c, + } + + cmdsConfig := &genericcli.CmdsConfig[*apiv2.TenantMemberServiceCreateRequest, *apiv2.TenantMemberServiceUpdateRequest, *apiv2.TenantMember]{ + BinaryName: config.BinaryName, + GenericCLI: genericcli.NewGenericCLI(w).WithFS(c.Fs), + Singular: "member", + Plural: "members", + Description: "manage api tenant members", + Sorter: sorters.TenantMemberSorter(), + DescribePrinter: func() printers.Printer { return c.DescribePrinter }, + ListPrinter: func() printers.Printer { return c.ListPrinter }, + DescribeCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("tenant", "", "the tenant to describe the tenant members of, defaults to tenant of the default project") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("tenant", c.Completion.Tenant)) + }, + ListCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("tenant", "", "the tenant to list the tenant members of, defaults to tenant of the default project") + cmd.Flags().String("role", "", "the role of the member") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("tenant", c.Completion.Tenant)) + genericcli.Must(cmd.RegisterFlagCompletionFunc("role", c.Completion.TenantRole)) + }, + CreateCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("tenant", "", "the tenant for which to create a tenant member, defaults to tenant of the default project") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("tenant", c.Completion.Tenant)) + }, + UpdateCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("tenant", "", "the tenant for which to update a tenant member, defaults to tenant of the default project") + cmd.Flags().String("role", "", "the role of the member") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("tenant", c.Completion.Tenant)) + genericcli.Must(cmd.RegisterFlagCompletionFunc("role", c.Completion.TenantRole)) + + }, + DeleteCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("tenant", "", "the tenant from which to delete a tenant member, defaults to tenant of the default project") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("tenant", c.Completion.Tenant)) + }, + EditCmdMutateFn: func(cmd *cobra.Command) { + cmd.Flags().String("tenant", "", "the tenant from which to edit a tenant member, defaults to tenant of the default project") + + genericcli.Must(cmd.RegisterFlagCompletionFunc("tenant", c.Completion.Tenant)) + }, + CreateRequestFromCLI: w.createRequestFromCLI, + UpdateRequestFromCLI: w.updateRequestFromCLI, + ValidArgsFn: w.c.Completion.TenantMember, + } + + leaveCmd := &cobra.Command{ + Use: "leave", + Short: "leave the given tenant", + RunE: func(cmd *cobra.Command, _ []string) error { + return w.leave() + }, + } + leaveCmd.Flags().String("tenant", "", "the tenant to leave, defaults to tenant of the default project") + genericcli.Must(leaveCmd.RegisterFlagCompletionFunc("tenant", c.Completion.Tenant)) + + return genericcli.NewCmds(cmdsConfig, leaveCmd) +} + +func (c *tenantMember) Get(id string) (*apiv2.TenantMember, error) { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + tenant, err := c.c.GetTenant() + if err != nil { + return nil, err + } + + resp, err := c.c.Client.Apiv2().TenantMember().Get(ctx, &apiv2.TenantMemberServiceGetRequest{ + Login: tenant, + }) + if err != nil { + return nil, err + } + + return resp.Member, nil +} + +func (c *tenantMember) List() ([]*apiv2.TenantMember, error) { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + tenant, err := c.c.GetTenant() + if err != nil { + return nil, err + } + + resp, err := c.c.Client.Apiv2().TenantMember().List(ctx, &apiv2.TenantMemberServiceListRequest{ + Login: tenant, + }) + if err != nil { + return nil, nil + } + + return resp.Members, nil +} + +func (c *tenantMember) Create(rq *apiv2.TenantMemberServiceCreateRequest) (*apiv2.TenantMember, error) { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + resp, err := c.c.Client.Apiv2().TenantMember().Create(ctx, rq) + if err != nil { + if errorutil.IsConflict(err) { + return nil, genericcli.AlreadyExistsError() + } + + return nil, err + } + + return resp.Member, nil +} + +func (c *tenantMember) Delete(id string) (*apiv2.TenantMember, error) { + tenant, err := c.c.GetTenant() + if err != nil { + return nil, err + } + + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + resp, err := c.c.Client.Apiv2().TenantMember().Delete(ctx, &apiv2.TenantMemberServiceDeleteRequest{ + Login: tenant, + Member: id, + }) + if err != nil { + return nil, fmt.Errorf("failed to remove member from tenant: %w", err) + } + + return resp.Member, nil +} + +func (c *tenantMember) Convert(r *apiv2.TenantMember) (string, *apiv2.TenantMemberServiceCreateRequest, *apiv2.TenantMemberServiceUpdateRequest, error) { + return r.Member, &apiv2.TenantMemberServiceCreateRequest{ + Login: r.Tenant, + Member: r.Member, + Role: r.Role, + Labels: pointer.SafeDeref(r.Meta).Labels, + }, + &apiv2.TenantMemberServiceUpdateRequest{ + Login: r.Tenant, + Member: r.Member, + Role: pointer.PointerOrNil(r.Role), + UpdateMeta: helpers.UpdateMetaFromMeta(r.Meta), + Labels: helpers.UpdateLabelsFromMeta(r.Meta), + }, + nil +} + +func (c *tenantMember) Update(rq *apiv2.TenantMemberServiceUpdateRequest) (*apiv2.TenantMember, error) { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + resp, err := c.c.Client.Apiv2().TenantMember().Update(ctx, rq) + if err != nil { + return nil, fmt.Errorf("failed to update member: %w", err) + } + + return resp.Member, nil +} + +func (c *tenantMember) updateRequestFromCLI(args []string) (*apiv2.TenantMemberServiceUpdateRequest, error) { + member, err := genericcli.GetExactlyOneArg(args) + if err != nil { + return nil, err + } + + tenant, err := c.c.GetTenant() + if err != nil { + return nil, err + } + + return &apiv2.TenantMemberServiceUpdateRequest{ + Login: tenant, + Member: member, + Role: pointer.PointerOrNil(apiv2.TenantRole(apiv2.TenantRole_value[viper.GetString("role")])), + }, nil +} + +func (c *tenantMember) createRequestFromCLI() (*apiv2.TenantMemberServiceCreateRequest, error) { + tenant, err := c.c.GetTenant() + if err != nil { + return nil, err + } + + return &apiv2.TenantMemberServiceCreateRequest{ + Login: tenant, + Member: viper.GetString("id"), + Role: apiv2.TenantRole(apiv2.TenantRole_value[viper.GetString("role")]), + }, nil +} + +func (c *tenantMember) leave() error { + ctx, cancel := c.c.NewRequestContext() + defer cancel() + + tenant, err := c.c.GetTenant() + if err != nil { + return err + } + + resp, err := c.c.Client.Apiv2().TenantMember().Leave(ctx, &apiv2.TenantMemberServiceLeaveRequest{ + Login: tenant, + }) + if err != nil { + return fmt.Errorf("failed to leave project: %w", err) + } + + return c.c.DescribePrinter.Print(resp.Member) +} diff --git a/cmd/completion/project.go b/cmd/completion/project.go index c4cc89a..689b355 100644 --- a/cmd/completion/project.go +++ b/cmd/completion/project.go @@ -53,7 +53,7 @@ func (c *Completion) ProjectInvite(cmd *cobra.Command, args []string, toComplete } func (c *Completion) ProjectMember(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - resp, err := c.Client.Apiv2().Project().Get(cmd.Context(), &apiv2.ProjectServiceGetRequest{ + resp, err := c.Client.Apiv2().ProjectMember().List(cmd.Context(), &apiv2.ProjectMemberServiceListRequest{ Project: c.Proj, }) if err != nil { @@ -62,8 +62,8 @@ func (c *Completion) ProjectMember(cmd *cobra.Command, args []string, toComplete var names []string - for _, member := range resp.ProjectMembers { - names = append(names, member.Id+"\t"+member.Role.String()) + for _, member := range resp.Members { + names = append(names, member.Member+"\t"+member.Role.String()) } return names, cobra.ShellCompDirectiveNoFileComp diff --git a/cmd/completion/tenant.go b/cmd/completion/tenant.go index e99e735..934d406 100644 --- a/cmd/completion/tenant.go +++ b/cmd/completion/tenant.go @@ -66,7 +66,7 @@ func (c *Completion) TenantMember(cmd *cobra.Command, args []string, toComplete return nil, cobra.ShellCompDirectiveError } - resp, err := c.Client.Apiv2().Tenant().Get(cmd.Context(), &apiv2.TenantServiceGetRequest{ + resp, err := c.Client.Apiv2().TenantMember().List(cmd.Context(), &apiv2.TenantMemberServiceListRequest{ Login: projectResp.Project.Tenant, }) if err != nil { @@ -75,8 +75,8 @@ func (c *Completion) TenantMember(cmd *cobra.Command, args []string, toComplete var names []string - for _, member := range resp.TenantMembers { - names = append(names, member.Id+"\t"+member.Role.String()) + for _, member := range resp.Members { + names = append(names, member.Member+"\t"+member.Role.String()) } return names, cobra.ShellCompDirectiveNoFileComp diff --git a/cmd/sorters/project.go b/cmd/sorters/project.go index f80487c..b38377c 100644 --- a/cmd/sorters/project.go +++ b/cmd/sorters/project.go @@ -2,6 +2,7 @@ package sorters import ( apiv2 "github.com/metal-stack/api/go/metalstack/api/v2" + "github.com/metal-stack/metal-lib/pkg/multisort" ) @@ -39,13 +40,13 @@ func ProjectInviteSorter() *multisort.Sorter[*apiv2.ProjectInvite] { func ProjectMemberSorter() *multisort.Sorter[*apiv2.ProjectMember] { return multisort.New(multisort.FieldMap[*apiv2.ProjectMember]{ "id": func(a, b *apiv2.ProjectMember, descending bool) multisort.CompareResult { - return multisort.Compare(a.Id, b.Id, descending) + return multisort.Compare(a.Member, b.Member, descending) }, "role": func(a, b *apiv2.ProjectMember, descending bool) multisort.CompareResult { return multisort.Compare(a.Role, b.Role, descending) }, "created": func(a, b *apiv2.ProjectMember, descending bool) multisort.CompareResult { - return multisort.Compare(a.CreatedAt.AsTime().UnixMilli(), b.CreatedAt.AsTime().UnixMilli(), descending) + return multisort.Compare(a.Meta.CreatedAt.AsTime().UnixMilli(), b.Meta.CreatedAt.AsTime().UnixMilli(), descending) }, "inherited": func(a, b *apiv2.ProjectMember, descending bool) multisort.CompareResult { boolToInt := func(in bool) int { diff --git a/cmd/sorters/tenant.go b/cmd/sorters/tenant.go index 159bb63..7768c60 100644 --- a/cmd/sorters/tenant.go +++ b/cmd/sorters/tenant.go @@ -2,6 +2,7 @@ package sorters import ( apiv2 "github.com/metal-stack/api/go/metalstack/api/v2" + "github.com/metal-stack/metal-lib/pkg/multisort" ) @@ -39,13 +40,13 @@ func TenantInviteSorter() *multisort.Sorter[*apiv2.TenantInvite] { func TenantMemberSorter() *multisort.Sorter[*apiv2.TenantMember] { return multisort.New(multisort.FieldMap[*apiv2.TenantMember]{ "id": func(a, b *apiv2.TenantMember, descending bool) multisort.CompareResult { - return multisort.Compare(a.Id, b.Id, descending) + return multisort.Compare(a.Member, b.Member, descending) }, "role": func(a, b *apiv2.TenantMember, descending bool) multisort.CompareResult { return multisort.Compare(a.Role, b.Role, descending) }, "created": func(a, b *apiv2.TenantMember, descending bool) multisort.CompareResult { - return multisort.Compare(a.CreatedAt.AsTime().UnixMilli(), b.CreatedAt.AsTime().UnixMilli(), descending) + return multisort.Compare(a.Meta.CreatedAt.AsTime().UnixMilli(), b.Meta.CreatedAt.AsTime().UnixMilli(), descending) }, }, multisort.Keys{{ID: "role"}, {ID: "id"}}) } diff --git a/cmd/tableprinters/common.go b/cmd/tableprinters/common.go index a349c4a..c85b175 100644 --- a/cmd/tableprinters/common.go +++ b/cmd/tableprinters/common.go @@ -8,6 +8,7 @@ import ( adminv2 "github.com/metal-stack/api/go/metalstack/admin/v2" apiv2 "github.com/metal-stack/api/go/metalstack/api/v2" + "github.com/metal-stack/cli/cmd/config" "github.com/metal-stack/metal-lib/pkg/genericcli/printers" "github.com/metal-stack/metal-lib/pkg/pointer" diff --git a/cmd/tableprinters/project.go b/cmd/tableprinters/project.go index 27e893a..88df538 100644 --- a/cmd/tableprinters/project.go +++ b/cmd/tableprinters/project.go @@ -6,6 +6,7 @@ import ( "github.com/dustin/go-humanize" apiv2 "github.com/metal-stack/api/go/metalstack/api/v2" + "github.com/metal-stack/metal-lib/pkg/genericcli" ) @@ -62,10 +63,10 @@ func (t *TablePrinter) ProjectMemberTable(data []*apiv2.ProjectMember, _ bool) ( for _, member := range data { row := []string{ - member.Id, + member.Member, member.Role.String(), strconv.FormatBool(member.InheritedMembership), - humanize.Time(member.CreatedAt.AsTime()), + humanize.Time(member.Meta.CreatedAt.AsTime()), } rows = append(rows, row) diff --git a/cmd/tableprinters/tenant.go b/cmd/tableprinters/tenant.go index 5e26223..35558e9 100644 --- a/cmd/tableprinters/tenant.go +++ b/cmd/tableprinters/tenant.go @@ -32,9 +32,9 @@ func (t *TablePrinter) TenantMemberTable(data []*apiv2.TenantMember, _ bool) ([] for _, member := range data { row := []string{ - member.Id, + member.Member, member.Role.String(), - humanize.Time(member.CreatedAt.AsTime()), + humanize.Time(member.Meta.CreatedAt.AsTime()), } rows = append(rows, row) diff --git a/docs/admin/metalctlv2_admin.md b/docs/admin/metalctlv2_admin.md index f6b5a8e..e620c5f 100644 --- a/docs/admin/metalctlv2_admin.md +++ b/docs/admin/metalctlv2_admin.md @@ -30,7 +30,7 @@ these commands utilize the admin api, which can only be accessed by metal-stack * [metalctlv2](metalctlv2.md) - cli for managing entities in metal-stack * [metalctlv2 admin audit](metalctlv2_admin_audit.md) - manage audit entities * [metalctlv2 admin component](metalctlv2_admin_component.md) - manage component entities -* [metalctlv2 admin filesystem](metalctlv2_admin_filesystem.md) - manage filesystem entities +* [metalctlv2 admin filesystemlayout](metalctlv2_admin_filesystemlayout.md) - manage filesystemlayout entities * [metalctlv2 admin image](metalctlv2_admin_image.md) - manage image entities * [metalctlv2 admin ip](metalctlv2_admin_ip.md) - manage ip entities * [metalctlv2 admin machine](metalctlv2_admin_machine.md) - manage machine entities diff --git a/docs/admin/metalctlv2_admin_filesystem.md b/docs/admin/metalctlv2_admin_filesystem.md deleted file mode 100644 index bd92e27..0000000 --- a/docs/admin/metalctlv2_admin_filesystem.md +++ /dev/null @@ -1,39 +0,0 @@ -## metalctlv2 admin filesystem - -manage filesystem entities - -### Synopsis - -manage filesystem layouts which define how disks, raid arrays and volumes are set up on machines during installation - -### Options - -``` - -h, --help help for filesystem -``` - -### Options inherited from parent commands - -``` - --api-token string the token used for api requests - --api-url string the url to the metal-stack.io api - -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) - --debug debug output - --force-color force colored output even without tty - -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") - --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. - --timeout duration request timeout used for api requests -``` - -### SEE ALSO - -* [metalctlv2 admin](metalctlv2_admin.md) - admin commands -* [metalctlv2 admin filesystem apply](metalctlv2_admin_filesystem_apply.md) - applies one or more filesystems from a given file -* [metalctlv2 admin filesystem create](metalctlv2_admin_filesystem_create.md) - creates the filesystem -* [metalctlv2 admin filesystem delete](metalctlv2_admin_filesystem_delete.md) - deletes the filesystem -* [metalctlv2 admin filesystem describe](metalctlv2_admin_filesystem_describe.md) - describes the filesystem -* [metalctlv2 admin filesystem edit](metalctlv2_admin_filesystem_edit.md) - edit the filesystem through an editor and update -* [metalctlv2 admin filesystem list](metalctlv2_admin_filesystem_list.md) - list all filesystems -* [metalctlv2 admin filesystem match](metalctlv2_admin_filesystem_match.md) - matches a filesystem layout to a size and image or to a machine -* [metalctlv2 admin filesystem update](metalctlv2_admin_filesystem_update.md) - updates the filesystem - diff --git a/docs/admin/metalctlv2_admin_filesystemlayout.md b/docs/admin/metalctlv2_admin_filesystemlayout.md new file mode 100644 index 0000000..89dea36 --- /dev/null +++ b/docs/admin/metalctlv2_admin_filesystemlayout.md @@ -0,0 +1,39 @@ +## metalctlv2 admin filesystemlayout + +manage filesystemlayout entities + +### Synopsis + +manage filesystem layouts which define how disks, raid arrays and volumes are set up on machines during installation + +### Options + +``` + -h, --help help for filesystemlayout +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin](metalctlv2_admin.md) - admin commands +* [metalctlv2 admin filesystemlayout apply](metalctlv2_admin_filesystemlayout_apply.md) - applies one or more filesystemlayouts from a given file +* [metalctlv2 admin filesystemlayout create](metalctlv2_admin_filesystemlayout_create.md) - creates the filesystemlayout +* [metalctlv2 admin filesystemlayout delete](metalctlv2_admin_filesystemlayout_delete.md) - deletes the filesystemlayout +* [metalctlv2 admin filesystemlayout describe](metalctlv2_admin_filesystemlayout_describe.md) - describes the filesystemlayout +* [metalctlv2 admin filesystemlayout edit](metalctlv2_admin_filesystemlayout_edit.md) - edit the filesystemlayout through an editor and update +* [metalctlv2 admin filesystemlayout list](metalctlv2_admin_filesystemlayout_list.md) - list all filesystemlayouts +* [metalctlv2 admin filesystemlayout match](metalctlv2_admin_filesystemlayout_match.md) - matches a filesystem layout to a size and image or to a machine +* [metalctlv2 admin filesystemlayout update](metalctlv2_admin_filesystemlayout_update.md) - updates the filesystemlayout + diff --git a/docs/admin/metalctlv2_admin_filesystemlayout_apply.md b/docs/admin/metalctlv2_admin_filesystemlayout_apply.md new file mode 100644 index 0000000..3b633f8 --- /dev/null +++ b/docs/admin/metalctlv2_admin_filesystemlayout_apply.md @@ -0,0 +1,46 @@ +## metalctlv2 admin filesystemlayout apply + +applies one or more filesystemlayouts from a given file + +``` +metalctlv2 admin filesystemlayout apply [flags] +``` + +### Options + +``` + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 filesystemlayout describe filesystemlayout-1 -o yaml > filesystemlayout.yaml + $ vi filesystemlayout.yaml + $ # either via stdin + $ cat filesystemlayout.yaml | metalctlv2 filesystemlayout apply -f - + $ # or via file + $ metalctlv2 filesystemlayout apply -f filesystemlayout.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for apply + --skip-security-prompts skips security prompt for bulk operations + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin filesystemlayout](metalctlv2_admin_filesystemlayout.md) - manage filesystemlayout entities + diff --git a/docs/admin/metalctlv2_admin_filesystemlayout_create.md b/docs/admin/metalctlv2_admin_filesystemlayout_create.md new file mode 100644 index 0000000..16fc9d7 --- /dev/null +++ b/docs/admin/metalctlv2_admin_filesystemlayout_create.md @@ -0,0 +1,46 @@ +## metalctlv2 admin filesystemlayout create + +creates the filesystemlayout + +``` +metalctlv2 admin filesystemlayout create [flags] +``` + +### Options + +``` + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 filesystemlayout describe filesystemlayout-1 -o yaml > filesystemlayout.yaml + $ vi filesystemlayout.yaml + $ # either via stdin + $ cat filesystemlayout.yaml | metalctlv2 filesystemlayout create -f - + $ # or via file + $ metalctlv2 filesystemlayout create -f filesystemlayout.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for create + --skip-security-prompts skips security prompt for bulk operations + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin filesystemlayout](metalctlv2_admin_filesystemlayout.md) - manage filesystemlayout entities + diff --git a/docs/admin/metalctlv2_admin_filesystemlayout_delete.md b/docs/admin/metalctlv2_admin_filesystemlayout_delete.md new file mode 100644 index 0000000..34c7491 --- /dev/null +++ b/docs/admin/metalctlv2_admin_filesystemlayout_delete.md @@ -0,0 +1,46 @@ +## metalctlv2 admin filesystemlayout delete + +deletes the filesystemlayout + +``` +metalctlv2 admin filesystemlayout delete [flags] +``` + +### Options + +``` + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 filesystemlayout describe filesystemlayout-1 -o yaml > filesystemlayout.yaml + $ vi filesystemlayout.yaml + $ # either via stdin + $ cat filesystemlayout.yaml | metalctlv2 filesystemlayout delete -f - + $ # or via file + $ metalctlv2 filesystemlayout delete -f filesystemlayout.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for delete + --skip-security-prompts skips security prompt for bulk operations + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin filesystemlayout](metalctlv2_admin_filesystemlayout.md) - manage filesystemlayout entities + diff --git a/docs/admin/metalctlv2_admin_filesystemlayout_describe.md b/docs/admin/metalctlv2_admin_filesystemlayout_describe.md new file mode 100644 index 0000000..cee52a7 --- /dev/null +++ b/docs/admin/metalctlv2_admin_filesystemlayout_describe.md @@ -0,0 +1,31 @@ +## metalctlv2 admin filesystemlayout describe + +describes the filesystemlayout + +``` +metalctlv2 admin filesystemlayout describe [flags] +``` + +### Options + +``` + -h, --help help for describe +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin filesystemlayout](metalctlv2_admin_filesystemlayout.md) - manage filesystemlayout entities + diff --git a/docs/admin/metalctlv2_admin_filesystemlayout_edit.md b/docs/admin/metalctlv2_admin_filesystemlayout_edit.md new file mode 100644 index 0000000..4cc6e00 --- /dev/null +++ b/docs/admin/metalctlv2_admin_filesystemlayout_edit.md @@ -0,0 +1,31 @@ +## metalctlv2 admin filesystemlayout edit + +edit the filesystemlayout through an editor and update + +``` +metalctlv2 admin filesystemlayout edit [flags] +``` + +### Options + +``` + -h, --help help for edit +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin filesystemlayout](metalctlv2_admin_filesystemlayout.md) - manage filesystemlayout entities + diff --git a/docs/admin/metalctlv2_admin_filesystem_list.md b/docs/admin/metalctlv2_admin_filesystemlayout_list.md similarity index 83% rename from docs/admin/metalctlv2_admin_filesystem_list.md rename to docs/admin/metalctlv2_admin_filesystemlayout_list.md index 552e4fc..db8e657 100644 --- a/docs/admin/metalctlv2_admin_filesystem_list.md +++ b/docs/admin/metalctlv2_admin_filesystemlayout_list.md @@ -1,9 +1,9 @@ -## metalctlv2 admin filesystem list +## metalctlv2 admin filesystemlayout list -list all filesystems +list all filesystemlayouts ``` -metalctlv2 admin filesystem list [flags] +metalctlv2 admin filesystemlayout list [flags] ``` ### Options @@ -29,5 +29,5 @@ metalctlv2 admin filesystem list [flags] ### SEE ALSO -* [metalctlv2 admin filesystem](metalctlv2_admin_filesystem.md) - manage filesystem entities +* [metalctlv2 admin filesystemlayout](metalctlv2_admin_filesystemlayout.md) - manage filesystemlayout entities diff --git a/docs/admin/metalctlv2_admin_filesystem_match.md b/docs/admin/metalctlv2_admin_filesystemlayout_match.md similarity index 64% rename from docs/admin/metalctlv2_admin_filesystem_match.md rename to docs/admin/metalctlv2_admin_filesystemlayout_match.md index 8530e1a..caa4be2 100644 --- a/docs/admin/metalctlv2_admin_filesystem_match.md +++ b/docs/admin/metalctlv2_admin_filesystemlayout_match.md @@ -1,4 +1,4 @@ -## metalctlv2 admin filesystem match +## metalctlv2 admin filesystemlayout match matches a filesystem layout to a size and image or to a machine @@ -8,17 +8,17 @@ matches a filesystem layout either to a given size and image combination, or checks whether a given filesystem layout matches a given machine. ``` -metalctlv2 admin filesystem match [flags] +metalctlv2 admin filesystemlayout match [flags] ``` ### Options ``` - --filesystem-layout string id of the filesystem layout to check against a machine - -h, --help help for match - --image string machine image to match against a filesystem layout - --machine string uuid of the machine to check against a filesystem layout - --size string machine size to match against a filesystem layout + -h, --help help for match + --id string id of the filesystem layout to check against a machine + --image string machine image to match against a filesystem layout + --machine string uuid of the machine to check against a filesystem layout + --size string machine size to match against a filesystem layout ``` ### Options inherited from parent commands @@ -36,5 +36,5 @@ metalctlv2 admin filesystem match [flags] ### SEE ALSO -* [metalctlv2 admin filesystem](metalctlv2_admin_filesystem.md) - manage filesystem entities +* [metalctlv2 admin filesystemlayout](metalctlv2_admin_filesystemlayout.md) - manage filesystemlayout entities diff --git a/docs/admin/metalctlv2_admin_filesystemlayout_update.md b/docs/admin/metalctlv2_admin_filesystemlayout_update.md new file mode 100644 index 0000000..848ed6d --- /dev/null +++ b/docs/admin/metalctlv2_admin_filesystemlayout_update.md @@ -0,0 +1,46 @@ +## metalctlv2 admin filesystemlayout update + +updates the filesystemlayout + +``` +metalctlv2 admin filesystemlayout update [flags] +``` + +### Options + +``` + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 filesystemlayout describe filesystemlayout-1 -o yaml > filesystemlayout.yaml + $ vi filesystemlayout.yaml + $ # either via stdin + $ cat filesystemlayout.yaml | metalctlv2 filesystemlayout update -f - + $ # or via file + $ metalctlv2 filesystemlayout update -f filesystemlayout.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for update + --skip-security-prompts skips security prompt for bulk operations + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin filesystemlayout](metalctlv2_admin_filesystemlayout.md) - manage filesystemlayout entities + diff --git a/docs/admin/metalctlv2_admin_partition.md b/docs/admin/metalctlv2_admin_partition.md index c76bfe4..5792597 100644 --- a/docs/admin/metalctlv2_admin_partition.md +++ b/docs/admin/metalctlv2_admin_partition.md @@ -28,6 +28,7 @@ manage partitions ### SEE ALSO * [metalctlv2 admin](metalctlv2_admin.md) - admin commands +* [metalctlv2 admin partition apply](metalctlv2_admin_partition_apply.md) - applies one or more partitions from a given file * [metalctlv2 admin partition capacity](metalctlv2_admin_partition_capacity.md) - show partition capacity * [metalctlv2 admin partition create](metalctlv2_admin_partition_create.md) - creates the partition * [metalctlv2 admin partition delete](metalctlv2_admin_partition_delete.md) - deletes the partition diff --git a/docs/admin/metalctlv2_admin_filesystem_apply.md b/docs/admin/metalctlv2_admin_partition_apply.md similarity index 75% rename from docs/admin/metalctlv2_admin_filesystem_apply.md rename to docs/admin/metalctlv2_admin_partition_apply.md index fc4b645..e96d77b 100644 --- a/docs/admin/metalctlv2_admin_filesystem_apply.md +++ b/docs/admin/metalctlv2_admin_partition_apply.md @@ -1,9 +1,9 @@ -## metalctlv2 admin filesystem apply +## metalctlv2 admin partition apply -applies one or more filesystems from a given file +applies one or more partitions from a given file ``` -metalctlv2 admin filesystem apply [flags] +metalctlv2 admin partition apply [flags] ``` ### Options @@ -13,12 +13,12 @@ metalctlv2 admin filesystem apply [flags] -f, --file string filename of the create or update request in yaml format, or - for stdin. Example: - $ metalctlv2 filesystem describe filesystem-1 -o yaml > filesystem.yaml - $ vi filesystem.yaml + $ metalctlv2 partition describe partition-1 -o yaml > partition.yaml + $ vi partition.yaml $ # either via stdin - $ cat filesystem.yaml | metalctlv2 filesystem apply -f - + $ cat partition.yaml | metalctlv2 partition apply -f - $ # or via file - $ metalctlv2 filesystem apply -f filesystem.yaml + $ metalctlv2 partition apply -f partition.yaml the file can also contain multiple documents and perform a bulk operation. @@ -42,5 +42,5 @@ metalctlv2 admin filesystem apply [flags] ### SEE ALSO -* [metalctlv2 admin filesystem](metalctlv2_admin_filesystem.md) - manage filesystem entities +* [metalctlv2 admin partition](metalctlv2_admin_partition.md) - manage partition entities diff --git a/docs/admin/metalctlv2_admin_project.md b/docs/admin/metalctlv2_admin_project.md index 6db9799..88cedcd 100644 --- a/docs/admin/metalctlv2_admin_project.md +++ b/docs/admin/metalctlv2_admin_project.md @@ -34,5 +34,6 @@ manage api projects * [metalctlv2 admin project describe](metalctlv2_admin_project_describe.md) - describes the project * [metalctlv2 admin project edit](metalctlv2_admin_project_edit.md) - edit the project through an editor and update * [metalctlv2 admin project list](metalctlv2_admin_project_list.md) - list all projects +* [metalctlv2 admin project member](metalctlv2_admin_project_member.md) - manage member entities * [metalctlv2 admin project update](metalctlv2_admin_project_update.md) - updates the project diff --git a/docs/admin/metalctlv2_admin_project_member.md b/docs/admin/metalctlv2_admin_project_member.md new file mode 100644 index 0000000..d3e82b6 --- /dev/null +++ b/docs/admin/metalctlv2_admin_project_member.md @@ -0,0 +1,38 @@ +## metalctlv2 admin project member + +manage member entities + +### Synopsis + +manage api project members + +### Options + +``` + -h, --help help for member +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin project](metalctlv2_admin_project.md) - manage project entities +* [metalctlv2 admin project member apply](metalctlv2_admin_project_member_apply.md) - applies one or more members from a given file +* [metalctlv2 admin project member create](metalctlv2_admin_project_member_create.md) - creates the member +* [metalctlv2 admin project member delete](metalctlv2_admin_project_member_delete.md) - deletes the member +* [metalctlv2 admin project member describe](metalctlv2_admin_project_member_describe.md) - describes the member +* [metalctlv2 admin project member edit](metalctlv2_admin_project_member_edit.md) - edit the member through an editor and update +* [metalctlv2 admin project member list](metalctlv2_admin_project_member_list.md) - list all members +* [metalctlv2 admin project member update](metalctlv2_admin_project_member_update.md) - updates the member + diff --git a/docs/admin/metalctlv2_admin_filesystem_create.md b/docs/admin/metalctlv2_admin_project_member_apply.md similarity index 74% rename from docs/admin/metalctlv2_admin_filesystem_create.md rename to docs/admin/metalctlv2_admin_project_member_apply.md index 7f451a3..0f92bb4 100644 --- a/docs/admin/metalctlv2_admin_filesystem_create.md +++ b/docs/admin/metalctlv2_admin_project_member_apply.md @@ -1,9 +1,9 @@ -## metalctlv2 admin filesystem create +## metalctlv2 admin project member apply -creates the filesystem +applies one or more members from a given file ``` -metalctlv2 admin filesystem create [flags] +metalctlv2 admin project member apply [flags] ``` ### Options @@ -13,16 +13,16 @@ metalctlv2 admin filesystem create [flags] -f, --file string filename of the create or update request in yaml format, or - for stdin. Example: - $ metalctlv2 filesystem describe filesystem-1 -o yaml > filesystem.yaml - $ vi filesystem.yaml + $ metalctlv2 member describe member-1 -o yaml > member.yaml + $ vi member.yaml $ # either via stdin - $ cat filesystem.yaml | metalctlv2 filesystem create -f - + $ cat member.yaml | metalctlv2 member apply -f - $ # or via file - $ metalctlv2 filesystem create -f filesystem.yaml + $ metalctlv2 member apply -f member.yaml the file can also contain multiple documents and perform a bulk operation. - -h, --help help for create + -h, --help help for apply --skip-security-prompts skips security prompt for bulk operations --timestamps when used with --file (bulk operation): prints timestamps in-between the operations ``` @@ -42,5 +42,5 @@ metalctlv2 admin filesystem create [flags] ### SEE ALSO -* [metalctlv2 admin filesystem](metalctlv2_admin_filesystem.md) - manage filesystem entities +* [metalctlv2 admin project member](metalctlv2_admin_project_member.md) - manage member entities diff --git a/docs/admin/metalctlv2_admin_project_member_create.md b/docs/admin/metalctlv2_admin_project_member_create.md new file mode 100644 index 0000000..0145459 --- /dev/null +++ b/docs/admin/metalctlv2_admin_project_member_create.md @@ -0,0 +1,47 @@ +## metalctlv2 admin project member create + +creates the member + +``` +metalctlv2 admin project member create [flags] +``` + +### Options + +``` + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 member describe member-1 -o yaml > member.yaml + $ vi member.yaml + $ # either via stdin + $ cat member.yaml | metalctlv2 member create -f - + $ # or via file + $ metalctlv2 member create -f member.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for create + --project string the project for which to create a project member, defaults to project of the default project + --skip-security-prompts skips security prompt for bulk operations + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin project member](metalctlv2_admin_project_member.md) - manage member entities + diff --git a/docs/admin/metalctlv2_admin_project_member_delete.md b/docs/admin/metalctlv2_admin_project_member_delete.md new file mode 100644 index 0000000..1a2eef0 --- /dev/null +++ b/docs/admin/metalctlv2_admin_project_member_delete.md @@ -0,0 +1,47 @@ +## metalctlv2 admin project member delete + +deletes the member + +``` +metalctlv2 admin project member delete [flags] +``` + +### Options + +``` + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 member describe member-1 -o yaml > member.yaml + $ vi member.yaml + $ # either via stdin + $ cat member.yaml | metalctlv2 member delete -f - + $ # or via file + $ metalctlv2 member delete -f member.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for delete + --project string the project from which to delete a project member, defaults to project of the default project + --skip-security-prompts skips security prompt for bulk operations + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin project member](metalctlv2_admin_project_member.md) - manage member entities + diff --git a/docs/admin/metalctlv2_admin_project_member_describe.md b/docs/admin/metalctlv2_admin_project_member_describe.md new file mode 100644 index 0000000..ebfc716 --- /dev/null +++ b/docs/admin/metalctlv2_admin_project_member_describe.md @@ -0,0 +1,32 @@ +## metalctlv2 admin project member describe + +describes the member + +``` +metalctlv2 admin project member describe [flags] +``` + +### Options + +``` + -h, --help help for describe + --project string the project to describe the project members of, defaults to project of the default project +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin project member](metalctlv2_admin_project_member.md) - manage member entities + diff --git a/docs/admin/metalctlv2_admin_project_member_edit.md b/docs/admin/metalctlv2_admin_project_member_edit.md new file mode 100644 index 0000000..5010707 --- /dev/null +++ b/docs/admin/metalctlv2_admin_project_member_edit.md @@ -0,0 +1,32 @@ +## metalctlv2 admin project member edit + +edit the member through an editor and update + +``` +metalctlv2 admin project member edit [flags] +``` + +### Options + +``` + -h, --help help for edit + --project string the project from which to edit a project member, defaults to project of the default project +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin project member](metalctlv2_admin_project_member.md) - manage member entities + diff --git a/docs/admin/metalctlv2_admin_tenant_add-member.md b/docs/admin/metalctlv2_admin_project_member_list.md similarity index 58% rename from docs/admin/metalctlv2_admin_tenant_add-member.md rename to docs/admin/metalctlv2_admin_project_member_list.md index bf95939..125493b 100644 --- a/docs/admin/metalctlv2_admin_tenant_add-member.md +++ b/docs/admin/metalctlv2_admin_project_member_list.md @@ -1,22 +1,18 @@ -## metalctlv2 admin tenant add-member +## metalctlv2 admin project member list -Add a new member to a tenant - -### Synopsis - -Add a new member to an existing tenant by specifying the tenant ID, member's ID, and role. +list all members ``` -metalctlv2 admin tenant add-member [flags] +metalctlv2 admin project member list [flags] ``` ### Options ``` - -h, --help help for add-member - --member-id string ID of the member to be added - --role string Role of the member within the tenant - --tenant-id string ID of the tenant where the member is added + -h, --help help for list + --project string the project to list the project members of, defaults to project of the default project + --role string the role of the member + --sort-by strings sort by (comma separated) column(s), sort direction can be changed by appending :asc or :desc behind the column identifier. possible values: created|id|inherited|role ``` ### Options inherited from parent commands @@ -34,5 +30,5 @@ metalctlv2 admin tenant add-member [flags] ### SEE ALSO -* [metalctlv2 admin tenant](metalctlv2_admin_tenant.md) - manage tenant entities +* [metalctlv2 admin project member](metalctlv2_admin_project_member.md) - manage member entities diff --git a/docs/admin/metalctlv2_admin_project_member_update.md b/docs/admin/metalctlv2_admin_project_member_update.md new file mode 100644 index 0000000..9db4264 --- /dev/null +++ b/docs/admin/metalctlv2_admin_project_member_update.md @@ -0,0 +1,48 @@ +## metalctlv2 admin project member update + +updates the member + +``` +metalctlv2 admin project member update [flags] +``` + +### Options + +``` + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 member describe member-1 -o yaml > member.yaml + $ vi member.yaml + $ # either via stdin + $ cat member.yaml | metalctlv2 member update -f - + $ # or via file + $ metalctlv2 member update -f member.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for update + --project string the project for which to update a project member, defaults to project of the default project + --role string the role of the member + --skip-security-prompts skips security prompt for bulk operations + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin project member](metalctlv2_admin_project_member.md) - manage member entities + diff --git a/docs/admin/metalctlv2_admin_tenant.md b/docs/admin/metalctlv2_admin_tenant.md index 66f3544..5fd1013 100644 --- a/docs/admin/metalctlv2_admin_tenant.md +++ b/docs/admin/metalctlv2_admin_tenant.md @@ -28,7 +28,12 @@ manage api tenants ### SEE ALSO * [metalctlv2 admin](metalctlv2_admin.md) - admin commands -* [metalctlv2 admin tenant add-member](metalctlv2_admin_tenant_add-member.md) - Add a new member to a tenant +* [metalctlv2 admin tenant apply](metalctlv2_admin_tenant_apply.md) - applies one or more tenants from a given file * [metalctlv2 admin tenant create](metalctlv2_admin_tenant_create.md) - creates the tenant +* [metalctlv2 admin tenant delete](metalctlv2_admin_tenant_delete.md) - deletes the tenant +* [metalctlv2 admin tenant describe](metalctlv2_admin_tenant_describe.md) - describes the tenant +* [metalctlv2 admin tenant edit](metalctlv2_admin_tenant_edit.md) - edit the tenant through an editor and update * [metalctlv2 admin tenant list](metalctlv2_admin_tenant_list.md) - list all tenants +* [metalctlv2 admin tenant member](metalctlv2_admin_tenant_member.md) - manage member entities +* [metalctlv2 admin tenant update](metalctlv2_admin_tenant_update.md) - updates the tenant diff --git a/docs/admin/metalctlv2_admin_tenant_apply.md b/docs/admin/metalctlv2_admin_tenant_apply.md new file mode 100644 index 0000000..4352b63 --- /dev/null +++ b/docs/admin/metalctlv2_admin_tenant_apply.md @@ -0,0 +1,46 @@ +## metalctlv2 admin tenant apply + +applies one or more tenants from a given file + +``` +metalctlv2 admin tenant apply [flags] +``` + +### Options + +``` + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 tenant describe tenant-1 -o yaml > tenant.yaml + $ vi tenant.yaml + $ # either via stdin + $ cat tenant.yaml | metalctlv2 tenant apply -f - + $ # or via file + $ metalctlv2 tenant apply -f tenant.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for apply + --skip-security-prompts skips security prompt for bulk operations + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin tenant](metalctlv2_admin_tenant.md) - manage tenant entities + diff --git a/docs/admin/metalctlv2_admin_tenant_create.md b/docs/admin/metalctlv2_admin_tenant_create.md index 63e9dbb..901b76c 100644 --- a/docs/admin/metalctlv2_admin_tenant_create.md +++ b/docs/admin/metalctlv2_admin_tenant_create.md @@ -26,6 +26,7 @@ metalctlv2 admin tenant create [flags] the file can also contain multiple documents and perform a bulk operation. -h, --help help for create + --login string the login id of the tenant to create --name string the name of the tenant to create --skip-security-prompts skips security prompt for bulk operations --timestamps when used with --file (bulk operation): prints timestamps in-between the operations diff --git a/docs/admin/metalctlv2_admin_filesystem_delete.md b/docs/admin/metalctlv2_admin_tenant_delete.md similarity index 76% rename from docs/admin/metalctlv2_admin_filesystem_delete.md rename to docs/admin/metalctlv2_admin_tenant_delete.md index da89f53..788535a 100644 --- a/docs/admin/metalctlv2_admin_filesystem_delete.md +++ b/docs/admin/metalctlv2_admin_tenant_delete.md @@ -1,9 +1,9 @@ -## metalctlv2 admin filesystem delete +## metalctlv2 admin tenant delete -deletes the filesystem +deletes the tenant ``` -metalctlv2 admin filesystem delete [flags] +metalctlv2 admin tenant delete [flags] ``` ### Options @@ -13,12 +13,12 @@ metalctlv2 admin filesystem delete [flags] -f, --file string filename of the create or update request in yaml format, or - for stdin. Example: - $ metalctlv2 filesystem describe filesystem-1 -o yaml > filesystem.yaml - $ vi filesystem.yaml + $ metalctlv2 tenant describe tenant-1 -o yaml > tenant.yaml + $ vi tenant.yaml $ # either via stdin - $ cat filesystem.yaml | metalctlv2 filesystem delete -f - + $ cat tenant.yaml | metalctlv2 tenant delete -f - $ # or via file - $ metalctlv2 filesystem delete -f filesystem.yaml + $ metalctlv2 tenant delete -f tenant.yaml the file can also contain multiple documents and perform a bulk operation. @@ -42,5 +42,5 @@ metalctlv2 admin filesystem delete [flags] ### SEE ALSO -* [metalctlv2 admin filesystem](metalctlv2_admin_filesystem.md) - manage filesystem entities +* [metalctlv2 admin tenant](metalctlv2_admin_tenant.md) - manage tenant entities diff --git a/docs/metalctlv2_filesystem_describe.md b/docs/admin/metalctlv2_admin_tenant_describe.md similarity index 82% rename from docs/metalctlv2_filesystem_describe.md rename to docs/admin/metalctlv2_admin_tenant_describe.md index 5ad91d7..3821f57 100644 --- a/docs/metalctlv2_filesystem_describe.md +++ b/docs/admin/metalctlv2_admin_tenant_describe.md @@ -1,9 +1,9 @@ -## metalctlv2 filesystem describe +## metalctlv2 admin tenant describe -describes the filesystem +describes the tenant ``` -metalctlv2 filesystem describe [flags] +metalctlv2 admin tenant describe [flags] ``` ### Options @@ -27,5 +27,5 @@ metalctlv2 filesystem describe [flags] ### SEE ALSO -* [metalctlv2 filesystem](metalctlv2_filesystem.md) - manage filesystem entities +* [metalctlv2 admin tenant](metalctlv2_admin_tenant.md) - manage tenant entities diff --git a/docs/admin/metalctlv2_admin_filesystem_edit.md b/docs/admin/metalctlv2_admin_tenant_edit.md similarity index 79% rename from docs/admin/metalctlv2_admin_filesystem_edit.md rename to docs/admin/metalctlv2_admin_tenant_edit.md index 0f5e807..e33d329 100644 --- a/docs/admin/metalctlv2_admin_filesystem_edit.md +++ b/docs/admin/metalctlv2_admin_tenant_edit.md @@ -1,9 +1,9 @@ -## metalctlv2 admin filesystem edit +## metalctlv2 admin tenant edit -edit the filesystem through an editor and update +edit the tenant through an editor and update ``` -metalctlv2 admin filesystem edit [flags] +metalctlv2 admin tenant edit [flags] ``` ### Options @@ -27,5 +27,5 @@ metalctlv2 admin filesystem edit [flags] ### SEE ALSO -* [metalctlv2 admin filesystem](metalctlv2_admin_filesystem.md) - manage filesystem entities +* [metalctlv2 admin tenant](metalctlv2_admin_tenant.md) - manage tenant entities diff --git a/docs/admin/metalctlv2_admin_tenant_member.md b/docs/admin/metalctlv2_admin_tenant_member.md new file mode 100644 index 0000000..feb9b0b --- /dev/null +++ b/docs/admin/metalctlv2_admin_tenant_member.md @@ -0,0 +1,38 @@ +## metalctlv2 admin tenant member + +manage member entities + +### Synopsis + +manage api tenant members + +### Options + +``` + -h, --help help for member +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin tenant](metalctlv2_admin_tenant.md) - manage tenant entities +* [metalctlv2 admin tenant member apply](metalctlv2_admin_tenant_member_apply.md) - applies one or more members from a given file +* [metalctlv2 admin tenant member create](metalctlv2_admin_tenant_member_create.md) - creates the member +* [metalctlv2 admin tenant member delete](metalctlv2_admin_tenant_member_delete.md) - deletes the member +* [metalctlv2 admin tenant member describe](metalctlv2_admin_tenant_member_describe.md) - describes the member +* [metalctlv2 admin tenant member edit](metalctlv2_admin_tenant_member_edit.md) - edit the member through an editor and update +* [metalctlv2 admin tenant member list](metalctlv2_admin_tenant_member_list.md) - list all members +* [metalctlv2 admin tenant member update](metalctlv2_admin_tenant_member_update.md) - updates the member + diff --git a/docs/admin/metalctlv2_admin_tenant_member_apply.md b/docs/admin/metalctlv2_admin_tenant_member_apply.md new file mode 100644 index 0000000..b1fb0ed --- /dev/null +++ b/docs/admin/metalctlv2_admin_tenant_member_apply.md @@ -0,0 +1,46 @@ +## metalctlv2 admin tenant member apply + +applies one or more members from a given file + +``` +metalctlv2 admin tenant member apply [flags] +``` + +### Options + +``` + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 member describe member-1 -o yaml > member.yaml + $ vi member.yaml + $ # either via stdin + $ cat member.yaml | metalctlv2 member apply -f - + $ # or via file + $ metalctlv2 member apply -f member.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for apply + --skip-security-prompts skips security prompt for bulk operations + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin tenant member](metalctlv2_admin_tenant_member.md) - manage member entities + diff --git a/docs/admin/metalctlv2_admin_tenant_member_create.md b/docs/admin/metalctlv2_admin_tenant_member_create.md new file mode 100644 index 0000000..281487d --- /dev/null +++ b/docs/admin/metalctlv2_admin_tenant_member_create.md @@ -0,0 +1,47 @@ +## metalctlv2 admin tenant member create + +creates the member + +``` +metalctlv2 admin tenant member create [flags] +``` + +### Options + +``` + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 member describe member-1 -o yaml > member.yaml + $ vi member.yaml + $ # either via stdin + $ cat member.yaml | metalctlv2 member create -f - + $ # or via file + $ metalctlv2 member create -f member.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for create + --skip-security-prompts skips security prompt for bulk operations + --tenant string the tenant for which to create a tenant member, defaults to tenant of the default project + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin tenant member](metalctlv2_admin_tenant_member.md) - manage member entities + diff --git a/docs/admin/metalctlv2_admin_tenant_member_delete.md b/docs/admin/metalctlv2_admin_tenant_member_delete.md new file mode 100644 index 0000000..3d54add --- /dev/null +++ b/docs/admin/metalctlv2_admin_tenant_member_delete.md @@ -0,0 +1,47 @@ +## metalctlv2 admin tenant member delete + +deletes the member + +``` +metalctlv2 admin tenant member delete [flags] +``` + +### Options + +``` + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 member describe member-1 -o yaml > member.yaml + $ vi member.yaml + $ # either via stdin + $ cat member.yaml | metalctlv2 member delete -f - + $ # or via file + $ metalctlv2 member delete -f member.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for delete + --skip-security-prompts skips security prompt for bulk operations + --tenant string the tenant from which to delete a tenant member, defaults to tenant of the default project + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin tenant member](metalctlv2_admin_tenant_member.md) - manage member entities + diff --git a/docs/admin/metalctlv2_admin_tenant_member_describe.md b/docs/admin/metalctlv2_admin_tenant_member_describe.md new file mode 100644 index 0000000..eb96e54 --- /dev/null +++ b/docs/admin/metalctlv2_admin_tenant_member_describe.md @@ -0,0 +1,32 @@ +## metalctlv2 admin tenant member describe + +describes the member + +``` +metalctlv2 admin tenant member describe [flags] +``` + +### Options + +``` + -h, --help help for describe + --tenant string the tenant to describe the tenant members of, defaults to tenant of the default project +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin tenant member](metalctlv2_admin_tenant_member.md) - manage member entities + diff --git a/docs/admin/metalctlv2_admin_tenant_member_edit.md b/docs/admin/metalctlv2_admin_tenant_member_edit.md new file mode 100644 index 0000000..4fc4077 --- /dev/null +++ b/docs/admin/metalctlv2_admin_tenant_member_edit.md @@ -0,0 +1,32 @@ +## metalctlv2 admin tenant member edit + +edit the member through an editor and update + +``` +metalctlv2 admin tenant member edit [flags] +``` + +### Options + +``` + -h, --help help for edit + --tenant string the tenant from which to edit a tenant member, defaults to tenant of the default project +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin tenant member](metalctlv2_admin_tenant_member.md) - manage member entities + diff --git a/docs/admin/metalctlv2_admin_tenant_member_list.md b/docs/admin/metalctlv2_admin_tenant_member_list.md new file mode 100644 index 0000000..990efb4 --- /dev/null +++ b/docs/admin/metalctlv2_admin_tenant_member_list.md @@ -0,0 +1,34 @@ +## metalctlv2 admin tenant member list + +list all members + +``` +metalctlv2 admin tenant member list [flags] +``` + +### Options + +``` + -h, --help help for list + --role string the role of the member + --sort-by strings sort by (comma separated) column(s), sort direction can be changed by appending :asc or :desc behind the column identifier. possible values: created|id|role + --tenant string the tenant to list the tenant members of, defaults to tenant of the default project +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin tenant member](metalctlv2_admin_tenant_member.md) - manage member entities + diff --git a/docs/admin/metalctlv2_admin_tenant_member_update.md b/docs/admin/metalctlv2_admin_tenant_member_update.md new file mode 100644 index 0000000..cb9511e --- /dev/null +++ b/docs/admin/metalctlv2_admin_tenant_member_update.md @@ -0,0 +1,48 @@ +## metalctlv2 admin tenant member update + +updates the member + +``` +metalctlv2 admin tenant member update [flags] +``` + +### Options + +``` + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 member describe member-1 -o yaml > member.yaml + $ vi member.yaml + $ # either via stdin + $ cat member.yaml | metalctlv2 member update -f - + $ # or via file + $ metalctlv2 member update -f member.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for update + --role string the role of the member + --skip-security-prompts skips security prompt for bulk operations + --tenant string the tenant for which to update a tenant member, defaults to tenant of the default project + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 admin tenant member](metalctlv2_admin_tenant_member.md) - manage member entities + diff --git a/docs/admin/metalctlv2_admin_filesystem_update.md b/docs/admin/metalctlv2_admin_tenant_update.md similarity index 76% rename from docs/admin/metalctlv2_admin_filesystem_update.md rename to docs/admin/metalctlv2_admin_tenant_update.md index 92a8ba9..3920b4d 100644 --- a/docs/admin/metalctlv2_admin_filesystem_update.md +++ b/docs/admin/metalctlv2_admin_tenant_update.md @@ -1,9 +1,9 @@ -## metalctlv2 admin filesystem update +## metalctlv2 admin tenant update -updates the filesystem +updates the tenant ``` -metalctlv2 admin filesystem update [flags] +metalctlv2 admin tenant update [flags] ``` ### Options @@ -13,12 +13,12 @@ metalctlv2 admin filesystem update [flags] -f, --file string filename of the create or update request in yaml format, or - for stdin. Example: - $ metalctlv2 filesystem describe filesystem-1 -o yaml > filesystem.yaml - $ vi filesystem.yaml + $ metalctlv2 tenant describe tenant-1 -o yaml > tenant.yaml + $ vi tenant.yaml $ # either via stdin - $ cat filesystem.yaml | metalctlv2 filesystem update -f - + $ cat tenant.yaml | metalctlv2 tenant update -f - $ # or via file - $ metalctlv2 filesystem update -f filesystem.yaml + $ metalctlv2 tenant update -f tenant.yaml the file can also contain multiple documents and perform a bulk operation. @@ -42,5 +42,5 @@ metalctlv2 admin filesystem update [flags] ### SEE ALSO -* [metalctlv2 admin filesystem](metalctlv2_admin_filesystem.md) - manage filesystem entities +* [metalctlv2 admin tenant](metalctlv2_admin_tenant.md) - manage tenant entities diff --git a/docs/metalctlv2.md b/docs/metalctlv2.md index d13d48c..5560c94 100644 --- a/docs/metalctlv2.md +++ b/docs/metalctlv2.md @@ -22,7 +22,7 @@ cli for managing entities in metal-stack * [metalctlv2 audit](metalctlv2_audit.md) - manage audit entities * [metalctlv2 completion](metalctlv2_completion.md) - Generate the autocompletion script for the specified shell * [metalctlv2 context](metalctlv2_context.md) - manage cli contexts -* [metalctlv2 filesystem](metalctlv2_filesystem.md) - manage filesystem entities +* [metalctlv2 filesystemlayout](metalctlv2_filesystemlayout.md) - manage filesystemlayout entities * [metalctlv2 health](metalctlv2_health.md) - print the client and server health information * [metalctlv2 image](metalctlv2_image.md) - manage image entities * [metalctlv2 ip](metalctlv2_ip.md) - manage ip entities diff --git a/docs/metalctlv2_filesystem.md b/docs/metalctlv2_filesystemlayout.md similarity index 75% rename from docs/metalctlv2_filesystem.md rename to docs/metalctlv2_filesystemlayout.md index 91624e2..518ad5c 100644 --- a/docs/metalctlv2_filesystem.md +++ b/docs/metalctlv2_filesystemlayout.md @@ -1,6 +1,6 @@ -## metalctlv2 filesystem +## metalctlv2 filesystemlayout -manage filesystem entities +manage filesystemlayout entities ### Synopsis @@ -9,7 +9,7 @@ a filesystem layout defines how disks, raid arrays and volumes are set up on a m ### Options ``` - -h, --help help for filesystem + -h, --help help for filesystemlayout ``` ### Options inherited from parent commands @@ -28,6 +28,6 @@ a filesystem layout defines how disks, raid arrays and volumes are set up on a m ### SEE ALSO * [metalctlv2](metalctlv2.md) - cli for managing entities in metal-stack -* [metalctlv2 filesystem describe](metalctlv2_filesystem_describe.md) - describes the filesystem -* [metalctlv2 filesystem list](metalctlv2_filesystem_list.md) - list all filesystems +* [metalctlv2 filesystemlayout describe](metalctlv2_filesystemlayout_describe.md) - describes the filesystemlayout +* [metalctlv2 filesystemlayout list](metalctlv2_filesystemlayout_list.md) - list all filesystemlayouts diff --git a/docs/admin/metalctlv2_admin_filesystem_describe.md b/docs/metalctlv2_filesystemlayout_describe.md similarity index 79% rename from docs/admin/metalctlv2_admin_filesystem_describe.md rename to docs/metalctlv2_filesystemlayout_describe.md index f331aa9..09231b3 100644 --- a/docs/admin/metalctlv2_admin_filesystem_describe.md +++ b/docs/metalctlv2_filesystemlayout_describe.md @@ -1,9 +1,9 @@ -## metalctlv2 admin filesystem describe +## metalctlv2 filesystemlayout describe -describes the filesystem +describes the filesystemlayout ``` -metalctlv2 admin filesystem describe [flags] +metalctlv2 filesystemlayout describe [flags] ``` ### Options @@ -27,5 +27,5 @@ metalctlv2 admin filesystem describe [flags] ### SEE ALSO -* [metalctlv2 admin filesystem](metalctlv2_admin_filesystem.md) - manage filesystem entities +* [metalctlv2 filesystemlayout](metalctlv2_filesystemlayout.md) - manage filesystemlayout entities diff --git a/docs/metalctlv2_filesystem_list.md b/docs/metalctlv2_filesystemlayout_list.md similarity index 84% rename from docs/metalctlv2_filesystem_list.md rename to docs/metalctlv2_filesystemlayout_list.md index 35a5a9d..7379b84 100644 --- a/docs/metalctlv2_filesystem_list.md +++ b/docs/metalctlv2_filesystemlayout_list.md @@ -1,9 +1,9 @@ -## metalctlv2 filesystem list +## metalctlv2 filesystemlayout list -list all filesystems +list all filesystemlayouts ``` -metalctlv2 filesystem list [flags] +metalctlv2 filesystemlayout list [flags] ``` ### Options @@ -29,5 +29,5 @@ metalctlv2 filesystem list [flags] ### SEE ALSO -* [metalctlv2 filesystem](metalctlv2_filesystem.md) - manage filesystem entities +* [metalctlv2 filesystemlayout](metalctlv2_filesystemlayout.md) - manage filesystemlayout entities diff --git a/docs/metalctlv2_project.md b/docs/metalctlv2_project.md index d0c1aa6..a3b7b4f 100644 --- a/docs/metalctlv2_project.md +++ b/docs/metalctlv2_project.md @@ -36,6 +36,6 @@ manage api projects * [metalctlv2 project invite](metalctlv2_project_invite.md) - manage project invites * [metalctlv2 project join](metalctlv2_project_join.md) - join a project of someone who shared an invite secret with you * [metalctlv2 project list](metalctlv2_project_list.md) - list all projects -* [metalctlv2 project member](metalctlv2_project_member.md) - manage project members +* [metalctlv2 project member](metalctlv2_project_member.md) - manage member entities * [metalctlv2 project update](metalctlv2_project_update.md) - updates the project diff --git a/docs/metalctlv2_project_member.md b/docs/metalctlv2_project_member.md index 88bc350..d7271b8 100644 --- a/docs/metalctlv2_project_member.md +++ b/docs/metalctlv2_project_member.md @@ -1,6 +1,10 @@ ## metalctlv2 project member -manage project members +manage member entities + +### Synopsis + +manage api project members ### Options @@ -24,7 +28,12 @@ manage project members ### SEE ALSO * [metalctlv2 project](metalctlv2_project.md) - manage project entities -* [metalctlv2 project member delete](metalctlv2_project_member_delete.md) - remove member from a project -* [metalctlv2 project member list](metalctlv2_project_member_list.md) - lists members of a project -* [metalctlv2 project member update](metalctlv2_project_member_update.md) - update member from a project +* [metalctlv2 project member apply](metalctlv2_project_member_apply.md) - applies one or more members from a given file +* [metalctlv2 project member create](metalctlv2_project_member_create.md) - creates the member +* [metalctlv2 project member delete](metalctlv2_project_member_delete.md) - deletes the member +* [metalctlv2 project member describe](metalctlv2_project_member_describe.md) - describes the member +* [metalctlv2 project member edit](metalctlv2_project_member_edit.md) - edit the member through an editor and update +* [metalctlv2 project member leave](metalctlv2_project_member_leave.md) - leave the given project +* [metalctlv2 project member list](metalctlv2_project_member_list.md) - list all members +* [metalctlv2 project member update](metalctlv2_project_member_update.md) - updates the member diff --git a/docs/metalctlv2_project_member_apply.md b/docs/metalctlv2_project_member_apply.md new file mode 100644 index 0000000..39d11ee --- /dev/null +++ b/docs/metalctlv2_project_member_apply.md @@ -0,0 +1,46 @@ +## metalctlv2 project member apply + +applies one or more members from a given file + +``` +metalctlv2 project member apply [flags] +``` + +### Options + +``` + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 member describe member-1 -o yaml > member.yaml + $ vi member.yaml + $ # either via stdin + $ cat member.yaml | metalctlv2 member apply -f - + $ # or via file + $ metalctlv2 member apply -f member.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for apply + --skip-security-prompts skips security prompt for bulk operations + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 project member](metalctlv2_project_member.md) - manage member entities + diff --git a/docs/metalctlv2_project_member_create.md b/docs/metalctlv2_project_member_create.md new file mode 100644 index 0000000..819c7d9 --- /dev/null +++ b/docs/metalctlv2_project_member_create.md @@ -0,0 +1,47 @@ +## metalctlv2 project member create + +creates the member + +``` +metalctlv2 project member create [flags] +``` + +### Options + +``` + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 member describe member-1 -o yaml > member.yaml + $ vi member.yaml + $ # either via stdin + $ cat member.yaml | metalctlv2 member create -f - + $ # or via file + $ metalctlv2 member create -f member.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for create + --project string the project for which to create a project member, defaults to project of the default project + --skip-security-prompts skips security prompt for bulk operations + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 project member](metalctlv2_project_member.md) - manage member entities + diff --git a/docs/metalctlv2_project_member_delete.md b/docs/metalctlv2_project_member_delete.md index c7c2aae..049d2a9 100644 --- a/docs/metalctlv2_project_member_delete.md +++ b/docs/metalctlv2_project_member_delete.md @@ -1,16 +1,31 @@ ## metalctlv2 project member delete -remove member from a project +deletes the member ``` -metalctlv2 project member delete [flags] +metalctlv2 project member delete [flags] ``` ### Options ``` - -h, --help help for delete - -p, --project string the project in which to remove the member + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 member describe member-1 -o yaml > member.yaml + $ vi member.yaml + $ # either via stdin + $ cat member.yaml | metalctlv2 member delete -f - + $ # or via file + $ metalctlv2 member delete -f member.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for delete + --project string the project from which to delete a project member, defaults to project of the default project + --skip-security-prompts skips security prompt for bulk operations + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations ``` ### Options inherited from parent commands @@ -28,5 +43,5 @@ metalctlv2 project member delete [flags] ### SEE ALSO -* [metalctlv2 project member](metalctlv2_project_member.md) - manage project members +* [metalctlv2 project member](metalctlv2_project_member.md) - manage member entities diff --git a/docs/metalctlv2_project_member_describe.md b/docs/metalctlv2_project_member_describe.md new file mode 100644 index 0000000..099b4f3 --- /dev/null +++ b/docs/metalctlv2_project_member_describe.md @@ -0,0 +1,32 @@ +## metalctlv2 project member describe + +describes the member + +``` +metalctlv2 project member describe [flags] +``` + +### Options + +``` + -h, --help help for describe + --project string the project to describe the project members of, defaults to project of the default project +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 project member](metalctlv2_project_member.md) - manage member entities + diff --git a/docs/metalctlv2_project_member_edit.md b/docs/metalctlv2_project_member_edit.md new file mode 100644 index 0000000..cd2e095 --- /dev/null +++ b/docs/metalctlv2_project_member_edit.md @@ -0,0 +1,32 @@ +## metalctlv2 project member edit + +edit the member through an editor and update + +``` +metalctlv2 project member edit [flags] +``` + +### Options + +``` + -h, --help help for edit + --project string the project from which to edit a project member, defaults to project of the default project +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 project member](metalctlv2_project_member.md) - manage member entities + diff --git a/docs/metalctlv2_project_member_leave.md b/docs/metalctlv2_project_member_leave.md new file mode 100644 index 0000000..7f2d740 --- /dev/null +++ b/docs/metalctlv2_project_member_leave.md @@ -0,0 +1,32 @@ +## metalctlv2 project member leave + +leave the given project + +``` +metalctlv2 project member leave [flags] +``` + +### Options + +``` + -h, --help help for leave + --project string the project to leave, defaults to project of the default project +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 project member](metalctlv2_project_member.md) - manage member entities + diff --git a/docs/metalctlv2_project_member_list.md b/docs/metalctlv2_project_member_list.md index e1ce860..c54b928 100644 --- a/docs/metalctlv2_project_member_list.md +++ b/docs/metalctlv2_project_member_list.md @@ -1,6 +1,6 @@ ## metalctlv2 project member list -lists members of a project +list all members ``` metalctlv2 project member list [flags] @@ -10,7 +10,8 @@ metalctlv2 project member list [flags] ``` -h, --help help for list - -p, --project string the project of which to list the members + --project string the project to list the project members of, defaults to project of the default project + --role string the role of the member --sort-by strings sort by (comma separated) column(s), sort direction can be changed by appending :asc or :desc behind the column identifier. possible values: created|id|inherited|role ``` @@ -29,5 +30,5 @@ metalctlv2 project member list [flags] ### SEE ALSO -* [metalctlv2 project member](metalctlv2_project_member.md) - manage project members +* [metalctlv2 project member](metalctlv2_project_member.md) - manage member entities diff --git a/docs/metalctlv2_project_member_update.md b/docs/metalctlv2_project_member_update.md index 4f29aaf..033cb9a 100644 --- a/docs/metalctlv2_project_member_update.md +++ b/docs/metalctlv2_project_member_update.md @@ -1,17 +1,32 @@ ## metalctlv2 project member update -update member from a project +updates the member ``` -metalctlv2 project member update [flags] +metalctlv2 project member update [flags] ``` ### Options ``` - -h, --help help for update - -p, --project string the project in which to remove the member - --role string the role of the member + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 member describe member-1 -o yaml > member.yaml + $ vi member.yaml + $ # either via stdin + $ cat member.yaml | metalctlv2 member update -f - + $ # or via file + $ metalctlv2 member update -f member.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for update + --project string the project for which to update a project member, defaults to project of the default project + --role string the role of the member + --skip-security-prompts skips security prompt for bulk operations + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations ``` ### Options inherited from parent commands @@ -29,5 +44,5 @@ metalctlv2 project member update [flags] ### SEE ALSO -* [metalctlv2 project member](metalctlv2_project_member.md) - manage project members +* [metalctlv2 project member](metalctlv2_project_member.md) - manage member entities diff --git a/docs/metalctlv2_tenant.md b/docs/metalctlv2_tenant.md index 9b29e1b..37fcd73 100644 --- a/docs/metalctlv2_tenant.md +++ b/docs/metalctlv2_tenant.md @@ -36,6 +36,6 @@ manage api tenants * [metalctlv2 tenant invite](metalctlv2_tenant_invite.md) - manage tenant invites * [metalctlv2 tenant join](metalctlv2_tenant_join.md) - join a tenant of someone who shared an invite secret with you * [metalctlv2 tenant list](metalctlv2_tenant_list.md) - list all tenants -* [metalctlv2 tenant member](metalctlv2_tenant_member.md) - manage tenant members +* [metalctlv2 tenant member](metalctlv2_tenant_member.md) - manage member entities * [metalctlv2 tenant update](metalctlv2_tenant_update.md) - updates the tenant diff --git a/docs/metalctlv2_tenant_member.md b/docs/metalctlv2_tenant_member.md index 7db51c2..ac4dd69 100644 --- a/docs/metalctlv2_tenant_member.md +++ b/docs/metalctlv2_tenant_member.md @@ -1,6 +1,10 @@ ## metalctlv2 tenant member -manage tenant members +manage member entities + +### Synopsis + +manage api tenant members ### Options @@ -24,7 +28,12 @@ manage tenant members ### SEE ALSO * [metalctlv2 tenant](metalctlv2_tenant.md) - manage tenant entities -* [metalctlv2 tenant member list](metalctlv2_tenant_member_list.md) - lists members of a tenant -* [metalctlv2 tenant member remove](metalctlv2_tenant_member_remove.md) - remove member from a tenant -* [metalctlv2 tenant member update](metalctlv2_tenant_member_update.md) - update member from a tenant +* [metalctlv2 tenant member apply](metalctlv2_tenant_member_apply.md) - applies one or more members from a given file +* [metalctlv2 tenant member create](metalctlv2_tenant_member_create.md) - creates the member +* [metalctlv2 tenant member delete](metalctlv2_tenant_member_delete.md) - deletes the member +* [metalctlv2 tenant member describe](metalctlv2_tenant_member_describe.md) - describes the member +* [metalctlv2 tenant member edit](metalctlv2_tenant_member_edit.md) - edit the member through an editor and update +* [metalctlv2 tenant member leave](metalctlv2_tenant_member_leave.md) - leave the given tenant +* [metalctlv2 tenant member list](metalctlv2_tenant_member_list.md) - list all members +* [metalctlv2 tenant member update](metalctlv2_tenant_member_update.md) - updates the member diff --git a/docs/metalctlv2_tenant_member_apply.md b/docs/metalctlv2_tenant_member_apply.md new file mode 100644 index 0000000..2c442dd --- /dev/null +++ b/docs/metalctlv2_tenant_member_apply.md @@ -0,0 +1,46 @@ +## metalctlv2 tenant member apply + +applies one or more members from a given file + +``` +metalctlv2 tenant member apply [flags] +``` + +### Options + +``` + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 member describe member-1 -o yaml > member.yaml + $ vi member.yaml + $ # either via stdin + $ cat member.yaml | metalctlv2 member apply -f - + $ # or via file + $ metalctlv2 member apply -f member.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for apply + --skip-security-prompts skips security prompt for bulk operations + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 tenant member](metalctlv2_tenant_member.md) - manage member entities + diff --git a/docs/metalctlv2_tenant_member_create.md b/docs/metalctlv2_tenant_member_create.md new file mode 100644 index 0000000..5403bbe --- /dev/null +++ b/docs/metalctlv2_tenant_member_create.md @@ -0,0 +1,47 @@ +## metalctlv2 tenant member create + +creates the member + +``` +metalctlv2 tenant member create [flags] +``` + +### Options + +``` + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 member describe member-1 -o yaml > member.yaml + $ vi member.yaml + $ # either via stdin + $ cat member.yaml | metalctlv2 member create -f - + $ # or via file + $ metalctlv2 member create -f member.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for create + --skip-security-prompts skips security prompt for bulk operations + --tenant string the tenant for which to create a tenant member, defaults to tenant of the default project + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 tenant member](metalctlv2_tenant_member.md) - manage member entities + diff --git a/docs/metalctlv2_tenant_member_delete.md b/docs/metalctlv2_tenant_member_delete.md new file mode 100644 index 0000000..72222dd --- /dev/null +++ b/docs/metalctlv2_tenant_member_delete.md @@ -0,0 +1,47 @@ +## metalctlv2 tenant member delete + +deletes the member + +``` +metalctlv2 tenant member delete [flags] +``` + +### Options + +``` + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 member describe member-1 -o yaml > member.yaml + $ vi member.yaml + $ # either via stdin + $ cat member.yaml | metalctlv2 member delete -f - + $ # or via file + $ metalctlv2 member delete -f member.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for delete + --skip-security-prompts skips security prompt for bulk operations + --tenant string the tenant from which to delete a tenant member, defaults to tenant of the default project + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 tenant member](metalctlv2_tenant_member.md) - manage member entities + diff --git a/docs/metalctlv2_tenant_member_describe.md b/docs/metalctlv2_tenant_member_describe.md new file mode 100644 index 0000000..9e553c4 --- /dev/null +++ b/docs/metalctlv2_tenant_member_describe.md @@ -0,0 +1,32 @@ +## metalctlv2 tenant member describe + +describes the member + +``` +metalctlv2 tenant member describe [flags] +``` + +### Options + +``` + -h, --help help for describe + --tenant string the tenant to describe the tenant members of, defaults to tenant of the default project +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 tenant member](metalctlv2_tenant_member.md) - manage member entities + diff --git a/docs/metalctlv2_tenant_member_edit.md b/docs/metalctlv2_tenant_member_edit.md new file mode 100644 index 0000000..a1cc671 --- /dev/null +++ b/docs/metalctlv2_tenant_member_edit.md @@ -0,0 +1,32 @@ +## metalctlv2 tenant member edit + +edit the member through an editor and update + +``` +metalctlv2 tenant member edit [flags] +``` + +### Options + +``` + -h, --help help for edit + --tenant string the tenant from which to edit a tenant member, defaults to tenant of the default project +``` + +### Options inherited from parent commands + +``` + --api-token string the token used for api requests + --api-url string the url to the metal-stack.io api + -c, --config string alternative config file path, (default is ~/.metal-stack/config.yaml) + --debug debug output + --force-color force colored output even without tty + -o, --output-format string output format (table|wide|markdown|json|yaml|template), wide is a table with more columns. (default "table") + --template string output template for template output-format, go template format. For property names inspect the output of -o json or -o yaml for reference. + --timeout duration request timeout used for api requests +``` + +### SEE ALSO + +* [metalctlv2 tenant member](metalctlv2_tenant_member.md) - manage member entities + diff --git a/docs/metalctlv2_tenant_member_remove.md b/docs/metalctlv2_tenant_member_leave.md similarity index 78% rename from docs/metalctlv2_tenant_member_remove.md rename to docs/metalctlv2_tenant_member_leave.md index 7c37c64..547d212 100644 --- a/docs/metalctlv2_tenant_member_remove.md +++ b/docs/metalctlv2_tenant_member_leave.md @@ -1,16 +1,16 @@ -## metalctlv2 tenant member remove +## metalctlv2 tenant member leave -remove member from a tenant +leave the given tenant ``` -metalctlv2 tenant member remove [flags] +metalctlv2 tenant member leave [flags] ``` ### Options ``` - -h, --help help for remove - --tenant string the tenant in which to remove the member + -h, --help help for leave + --tenant string the tenant to leave, defaults to tenant of the default project ``` ### Options inherited from parent commands @@ -28,5 +28,5 @@ metalctlv2 tenant member remove [flags] ### SEE ALSO -* [metalctlv2 tenant member](metalctlv2_tenant_member.md) - manage tenant members +* [metalctlv2 tenant member](metalctlv2_tenant_member.md) - manage member entities diff --git a/docs/metalctlv2_tenant_member_list.md b/docs/metalctlv2_tenant_member_list.md index 6037691..8bb93b9 100644 --- a/docs/metalctlv2_tenant_member_list.md +++ b/docs/metalctlv2_tenant_member_list.md @@ -1,6 +1,6 @@ ## metalctlv2 tenant member list -lists members of a tenant +list all members ``` metalctlv2 tenant member list [flags] @@ -10,8 +10,9 @@ metalctlv2 tenant member list [flags] ``` -h, --help help for list + --role string the role of the member --sort-by strings sort by (comma separated) column(s), sort direction can be changed by appending :asc or :desc behind the column identifier. possible values: created|id|role - --tenant string the tenant in which to remove the member + --tenant string the tenant to list the tenant members of, defaults to tenant of the default project ``` ### Options inherited from parent commands @@ -29,5 +30,5 @@ metalctlv2 tenant member list [flags] ### SEE ALSO -* [metalctlv2 tenant member](metalctlv2_tenant_member.md) - manage tenant members +* [metalctlv2 tenant member](metalctlv2_tenant_member.md) - manage member entities diff --git a/docs/metalctlv2_tenant_member_update.md b/docs/metalctlv2_tenant_member_update.md index 3eeae30..cdc8083 100644 --- a/docs/metalctlv2_tenant_member_update.md +++ b/docs/metalctlv2_tenant_member_update.md @@ -1,17 +1,32 @@ ## metalctlv2 tenant member update -update member from a tenant +updates the member ``` -metalctlv2 tenant member update [flags] +metalctlv2 tenant member update [flags] ``` ### Options ``` - -h, --help help for update - --role string the role of the member - --tenant string the tenant in which to remove the member + --bulk-output when used with --file (bulk operation): prints results at the end as a list. default is printing results intermediately during the operation, which causes single entities to be printed in a row. + -f, --file string filename of the create or update request in yaml format, or - for stdin. + + Example: + $ metalctlv2 member describe member-1 -o yaml > member.yaml + $ vi member.yaml + $ # either via stdin + $ cat member.yaml | metalctlv2 member update -f - + $ # or via file + $ metalctlv2 member update -f member.yaml + + the file can also contain multiple documents and perform a bulk operation. + + -h, --help help for update + --role string the role of the member + --skip-security-prompts skips security prompt for bulk operations + --tenant string the tenant for which to update a tenant member, defaults to tenant of the default project + --timestamps when used with --file (bulk operation): prints timestamps in-between the operations ``` ### Options inherited from parent commands @@ -29,5 +44,5 @@ metalctlv2 tenant member update [flags] ### SEE ALSO -* [metalctlv2 tenant member](metalctlv2_tenant_member.md) - manage tenant members +* [metalctlv2 tenant member](metalctlv2_tenant_member.md) - manage member entities diff --git a/go.mod b/go.mod index cddade4..f2864b6 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/fatih/color v1.19.0 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 - github.com/metal-stack/api v0.8.3 + github.com/metal-stack/api v0.8.5-0.20261026134536-c07a525c4b94 github.com/metal-stack/metal-console v0.8.2 github.com/metal-stack/metal-lib v0.26.4 github.com/metal-stack/v v1.0.3 diff --git a/go.sum b/go.sum index b4412a0..c204474 100644 --- a/go.sum +++ b/go.sum @@ -197,8 +197,8 @@ github.com/mdlayher/sdnotify v1.0.0 h1:Ma9XeLVN/l0qpyx1tNeMSeTjCPH6NtuD6/N9XdTlQ github.com/mdlayher/sdnotify v1.0.0/go.mod h1:HQUmpM4XgYkhDLtd+Uad8ZFK1T9D5+pNxnXQjCeJlGE= github.com/mdlayher/socket v0.8.0 h1:1lIVvHAs3sT623kPkPDa+I0nLVusskwnpWzp6ZUcNyc= github.com/mdlayher/socket v0.8.0/go.mod h1:EhNb63aXqexVoTJDblxvDOSuIGIJinC4H5ZktnaJ6Rk= -github.com/metal-stack/api v0.8.3 h1:ii29tTXP1HLN6dUGLwgFjBlDiz0BHTtla5gUJtxPe34= -github.com/metal-stack/api v0.8.3/go.mod h1:U0CJxoo35jpS87HNDbVDrilxR106TnE5rJ/xSmgQkPg= +github.com/metal-stack/api v0.8.5-0.20261026134536-c07a525c4b94 h1:04P1q9TE0WXXvwvfMuEWJEVzNXQtlpJvhJ07cu8WjDk= +github.com/metal-stack/api v0.8.5-0.20261026134536-c07a525c4b94/go.mod h1:U0CJxoo35jpS87HNDbVDrilxR106TnE5rJ/xSmgQkPg= github.com/metal-stack/metal-console v0.8.2 h1:Y86penzEROJKcLica1PeE2ddtr9G0/u16HiCAYXaxxU= github.com/metal-stack/metal-console v0.8.2/go.mod h1:ZkselOaxF/iELFL9Tku3maXgpX4DM0CHjoG7CGuky6E= github.com/metal-stack/metal-lib v0.26.4 h1:Qg+JorX0AgQCkrCK07wvstGEoRcm/Y97E2UG5ZBAXjo= diff --git a/pkg/helpers/network.go b/pkg/helpers/network.go index b244ded..82faa3c 100644 --- a/pkg/helpers/network.go +++ b/pkg/helpers/network.go @@ -43,14 +43,20 @@ func NetworkAddressFamilyToType(af string) *apiv2.NetworkAddressFamily { } } -func AddressFamilyFromPrefixes(prefixes ...string) (*apiv2.NetworkAddressFamily, error) { +func AddressFamilyFromPrefixes(n *apiv2.Network) (*apiv2.NetworkAddressFamily, error) { + switch n.Type { + case apiv2.NetworkType_NETWORK_TYPE_EXTERNAL, apiv2.NetworkType_NETWORK_TYPE_SUPER, apiv2.NetworkType_NETWORK_TYPE_UNDERLAY: + // will be derived by metal-apiserver + return nil, nil + } + var ( addressFamily *apiv2.NetworkAddressFamily isIPv4 bool isIPv6 bool ) - for _, pfx := range prefixes { + for _, pfx := range n.Prefixes { p, err := netip.ParsePrefix(pfx) if err != nil { return nil, err diff --git a/tests/e2e/admin/filesystem_test.go b/tests/e2e/admin/filesystem_test.go index f75a35c..84da935 100644 --- a/tests/e2e/admin/filesystem_test.go +++ b/tests/e2e/admin/filesystem_test.go @@ -19,7 +19,7 @@ func Test_AdminFileSystemCmd_List(t *testing.T) { tests := []*e2e.Test[apiv2.FilesystemServiceListResponse, *apiv2.FilesystemLayout]{ { Name: "list", - CmdArgs: []string{"admin", "filesystem", "list"}, + CmdArgs: []string{"admin", "filesystemlayout", "list"}, NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ ClientCalls: []client.ClientCall{ { @@ -36,14 +36,14 @@ func Test_AdminFileSystemCmd_List(t *testing.T) { }, }), WantTable: new(` - ID NAME DESCRIPTION SIZES IMAGES - debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 - ubuntu-raid1 Ubuntu Raid1 Raid1 layout for ubuntu machines m2.large ubuntu:>= 24.0 + ID NAME DESCRIPTION SIZES IMAGES + debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 + ubuntu-raid1 Ubuntu Raid1 Raid1 layout for ubuntu machines m2.large ubuntu:>= 24.0 `), WantWideTable: new(` - ID NAME DESCRIPTION SIZES IMAGES FILESYSTEMS DISKS RAID VOLUME GROUPS LOGICAL VOLUMES - debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 1 1 0 0 0 - ubuntu-raid1 Ubuntu Raid1 Raid1 layout for ubuntu machines m2.large ubuntu:>= 24.0 0 0 1 1 1 + ID NAME DESCRIPTION SIZES IMAGES FILESYSTEMS DISKS RAID VOLUME GROUPS LOGICAL VOLUMES + debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 1 1 0 0 0 + ubuntu-raid1 Ubuntu Raid1 Raid1 layout for ubuntu machines m2.large ubuntu:>= 24.0 0 0 1 1 1 `), Template: new("{{ .id }} {{ .name }}"), WantTemplate: new(` @@ -67,7 +67,7 @@ func Test_AdminFileSystemCmd_Describe(t *testing.T) { tests := []*e2e.Test[apiv2.FilesystemServiceGetResponse, *apiv2.FilesystemLayout]{ { Name: "describe", - CmdArgs: []string{"admin", "filesystem", "describe", testresources.FilesystemLayout1().Id}, + CmdArgs: []string{"admin", "filesystemlayout", "describe", testresources.FilesystemLayout1().Id}, NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ ClientCalls: []client.ClientCall{ { @@ -84,12 +84,12 @@ func Test_AdminFileSystemCmd_Describe(t *testing.T) { }), WantProtoObject: testresources.FilesystemLayout1(), WantTable: new(` - ID NAME DESCRIPTION SIZES IMAGES - debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 + ID NAME DESCRIPTION SIZES IMAGES + debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 `), WantWideTable: new(` - ID NAME DESCRIPTION SIZES IMAGES FILESYSTEMS DISKS RAID VOLUME GROUPS LOGICAL VOLUMES - debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 1 1 0 0 0 + ID NAME DESCRIPTION SIZES IMAGES FILESYSTEMS DISKS RAID VOLUME GROUPS LOGICAL VOLUMES + debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 1 1 0 0 0 `), Template: new("{{ .id }} {{ .name }}"), WantTemplate: new(` @@ -111,7 +111,7 @@ func Test_AdminFileSystemCmd_Create(t *testing.T) { tests := []*e2e.Test[adminv2.FilesystemServiceCreateResponse, *apiv2.FilesystemLayout]{ { Name: "create from file", - CmdArgs: append([]string{"admin", "filesystem", "create"}, e2e.AppendFromFileCommonArgs()...), + CmdArgs: append([]string{"admin", "filesystemlayout", "create"}, e2e.AppendFromFileCommonArgs()...), NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ FsMocks: func(fs *afero.Afero) { @@ -131,12 +131,12 @@ func Test_AdminFileSystemCmd_Create(t *testing.T) { }, }), WantTable: new(` - ID NAME DESCRIPTION SIZES IMAGES - debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 + ID NAME DESCRIPTION SIZES IMAGES + debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 `), WantWideTable: new(` - ID NAME DESCRIPTION SIZES IMAGES FILESYSTEMS DISKS RAID VOLUME GROUPS LOGICAL VOLUMES - debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 1 1 0 0 0 + ID NAME DESCRIPTION SIZES IMAGES FILESYSTEMS DISKS RAID VOLUME GROUPS LOGICAL VOLUMES + debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 1 1 0 0 0 `), Template: new("{{ .id }} {{ .name }}"), WantTemplate: new(` @@ -160,7 +160,7 @@ func Test_AdminFileSystemCmd_Update(t *testing.T) { tests := []*e2e.Test[adminv2.FilesystemServiceUpdateResponse, *apiv2.FilesystemLayout]{ { Name: "update from file", - CmdArgs: append([]string{"admin", "filesystem", "update"}, e2e.AppendFromFileCommonArgs()...), + CmdArgs: append([]string{"admin", "filesystemlayout", "update"}, e2e.AppendFromFileCommonArgs()...), NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ FsMocks: func(fs *afero.Afero) { @@ -189,12 +189,12 @@ func Test_AdminFileSystemCmd_Update(t *testing.T) { }, }), WantTable: new(` - ID NAME DESCRIPTION SIZES IMAGES - debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 + ID NAME DESCRIPTION SIZES IMAGES + debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 `), WantWideTable: new(` - ID NAME DESCRIPTION SIZES IMAGES FILESYSTEMS DISKS RAID VOLUME GROUPS LOGICAL VOLUMES - debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 1 1 0 0 0 + ID NAME DESCRIPTION SIZES IMAGES FILESYSTEMS DISKS RAID VOLUME GROUPS LOGICAL VOLUMES + debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 1 1 0 0 0 `), Template: new("{{ .id }} {{ .name }}"), WantTemplate: new(` @@ -216,7 +216,7 @@ func Test_AdminFileSystemCmd_Delete(t *testing.T) { tests := []*e2e.Test[adminv2.FilesystemServiceDeleteResponse, *apiv2.FilesystemLayout]{ { Name: "delete", - CmdArgs: []string{"admin", "filesystem", "delete", testresources.FilesystemLayout1().Id}, + CmdArgs: []string{"admin", "filesystemlayout", "delete", testresources.FilesystemLayout1().Id}, NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ ClientCalls: []client.ClientCall{ { @@ -233,12 +233,12 @@ func Test_AdminFileSystemCmd_Delete(t *testing.T) { }), WantProtoObject: testresources.FilesystemLayout1(), WantTable: new(` - ID NAME DESCRIPTION SIZES IMAGES - debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 + ID NAME DESCRIPTION SIZES IMAGES + debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 `), WantWideTable: new(` - ID NAME DESCRIPTION SIZES IMAGES FILESYSTEMS DISKS RAID VOLUME GROUPS LOGICAL VOLUMES - debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 1 1 0 0 0 + ID NAME DESCRIPTION SIZES IMAGES FILESYSTEMS DISKS RAID VOLUME GROUPS LOGICAL VOLUMES + debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 1 1 0 0 0 `), Template: new("{{ .id }} {{ .name }}"), WantTemplate: new(` @@ -260,7 +260,7 @@ func Test_AdminFileSystemCmd_Match_SizeAndImage(t *testing.T) { tests := []*e2e.Test[adminv2.FilesystemServiceMatchResponse, *apiv2.FilesystemLayout]{ { Name: "match size and image", - CmdArgs: []string{"admin", "filesystem", "match", "--size", "m2.small", "--image", "debian"}, + CmdArgs: []string{"admin", "filesystemlayout", "match", "--size", "m2.small", "--image", "debian"}, NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ ClientCalls: []client.ClientCall{ { @@ -281,12 +281,12 @@ func Test_AdminFileSystemCmd_Match_SizeAndImage(t *testing.T) { }, }), WantTable: new(` - ID NAME DESCRIPTION SIZES IMAGES - debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 + ID NAME DESCRIPTION SIZES IMAGES + debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 `), WantWideTable: new(` - ID NAME DESCRIPTION SIZES IMAGES FILESYSTEMS DISKS RAID VOLUME GROUPS LOGICAL VOLUMES - debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 1 1 0 0 0 + ID NAME DESCRIPTION SIZES IMAGES FILESYSTEMS DISKS RAID VOLUME GROUPS LOGICAL VOLUMES + debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 1 1 0 0 0 `), Template: new("{{ .id }} {{ .name }}"), WantTemplate: new(` @@ -310,7 +310,7 @@ func Test_AdminFileSystemCmd_Match_MachineAndLayout(t *testing.T) { tests := []*e2e.Test[adminv2.FilesystemServiceMatchResponse, *apiv2.FilesystemLayout]{ { Name: "match machine and filesystem layout", - CmdArgs: []string{"admin", "filesystem", "match", "--machine", machineUUID, "--id", testresources.FilesystemLayout1().Id}, + CmdArgs: []string{"admin", "filesystemlayout", "match", "--machine", machineUUID, "--id", testresources.FilesystemLayout1().Id}, NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ ClientCalls: []client.ClientCall{ { @@ -331,12 +331,12 @@ func Test_AdminFileSystemCmd_Match_MachineAndLayout(t *testing.T) { }, }), WantTable: new(` - ID NAME DESCRIPTION SIZES IMAGES - debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 + ID NAME DESCRIPTION SIZES IMAGES + debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 `), WantWideTable: new(` - ID NAME DESCRIPTION SIZES IMAGES FILESYSTEMS DISKS RAID VOLUME GROUPS LOGICAL VOLUMES - debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 1 1 0 0 0 + ID NAME DESCRIPTION SIZES IMAGES FILESYSTEMS DISKS RAID VOLUME GROUPS LOGICAL VOLUMES + debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 1 1 0 0 0 `), Template: new("{{ .id }} {{ .name }}"), WantTemplate: new(` @@ -358,13 +358,13 @@ func Test_AdminFileSystemCmd_Match_InvalidFlags(t *testing.T) { tests := []*e2e.Test[any, any]{ { Name: "match without flags fails", - CmdArgs: []string{"admin", "filesystem", "match"}, + CmdArgs: []string{"admin", "filesystemlayout", "match"}, NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{}), WantErr: fmt.Errorf("either both --size and --image or both --machine and --id must be set"), }, { Name: "match with only size fails", - CmdArgs: []string{"admin", "filesystem", "match", "--size", "m2.small"}, + CmdArgs: []string{"admin", "filesystemlayout", "match", "--size", "m2.small"}, NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{}), WantErr: fmt.Errorf("either both --size and --image or both --machine and --id must be set"), }, diff --git a/tests/e2e/admin/image_test.go b/tests/e2e/admin/image_test.go index f8e7a0f..fc84757 100644 --- a/tests/e2e/admin/image_test.go +++ b/tests/e2e/admin/image_test.go @@ -1,6 +1,7 @@ package admin_e2e import ( + "fmt" "testing" "connectrpc.com/connect" @@ -246,9 +247,83 @@ func Test_AdminImageCmd_Usage(t *testing.T) { ubuntu-24.04 Ubuntu 24.04 Ubuntu 24.04 LTS machine supported 2 `), WantWideTable: new(` - ID NAME DESCRIPTION FEATURES EXPIRATION STATUS USAGE - ubuntu-24.04 Ubuntu 24.04 Ubuntu 24.04 LTS machine supported machine-a - machine-b + ID NAME DESCRIPTION FEATURES EXPIRATION STATUS USAGE + ubuntu-24.04 Ubuntu 24.04 Ubuntu 24.04 LTS machine supported machine-a + machine-b + `), + }, + } + for _, tt := range tests { + tt.TestCmd(t) + } +} + +func Test_AdminImageCmd_Apply(t *testing.T) { + tests := []*e2e.Test[adminv2.ImageServiceUpdateResponse, *apiv2.Image]{ + { + Name: "apply", + CmdArgs: append([]string{"admin", "image", "apply"}, e2e.AppendFromFileCommonArgs()...), + NewRootCmd: e2erootcmd.NewRootCmd(t, + &e2erootcmd.TestConfig{ + FsMocks: func(fs *afero.Afero) { + require.NoError(t, fs.WriteFile(e2e.InputFilePath, e2e.MustMarshal(t, testresources.Image1()), 0755)) + }, + ClientCalls: []client.ClientCall{ + { + WantRequest: &adminv2.ImageServiceCreateRequest{ + Image: testresources.Image1(), + }, + WantResponse: func() connect.AnyResponse { + return connect.NewResponse(&adminv2.ImageServiceCreateResponse{ + Image: testresources.Image1(), + }) + }, + }, + }, + }), + WantTable: new(` + ID NAME DESCRIPTION FEATURES EXPIRATION STATUS + ubuntu-24.04 Ubuntu 24.04 Ubuntu 24.04 LTS machine supported + `), + }, + { + Name: "apply already exists", + CmdArgs: append([]string{"admin", "image", "apply"}, e2e.AppendFromFileCommonArgs()...), + NewRootCmd: e2erootcmd.NewRootCmd(t, + &e2erootcmd.TestConfig{ + FsMocks: func(fs *afero.Afero) { + require.NoError(t, fs.WriteFile(e2e.InputFilePath, e2e.MustMarshal(t, testresources.Image1()), 0755)) + }, + ClientCalls: []client.ClientCall{ + { + WantRequest: &adminv2.ImageServiceCreateRequest{ + Image: testresources.Image1(), + }, + WantError: connect.NewError(connect.CodeAlreadyExists, fmt.Errorf("already exists")), + }, + { + WantRequest: &adminv2.ImageServiceUpdateRequest{ + Id: testresources.Image1().Id, + Url: new(testresources.Image1().Url), + Name: testresources.Image1().Name, + Description: testresources.Image1().Description, + Features: testresources.Image1().Features, + Classification: testresources.Image1().Classification, + UpdateMeta: &apiv2.UpdateMeta{ + LockingStrategy: apiv2.OptimisticLockingStrategy_OPTIMISTIC_LOCKING_STRATEGY_SERVER, + }, + }, + WantResponse: func() connect.AnyResponse { + return connect.NewResponse(&adminv2.ImageServiceUpdateResponse{ + Image: testresources.Image1(), + }) + }, + }, + }, + }), + WantTable: new(` + ID NAME DESCRIPTION FEATURES EXPIRATION STATUS + ubuntu-24.04 Ubuntu 24.04 Ubuntu 24.04 LTS machine supported `), }, } diff --git a/tests/e2e/admin/network_test.go b/tests/e2e/admin/network_test.go index d0e82f9..fc52012 100644 --- a/tests/e2e/admin/network_test.go +++ b/tests/e2e/admin/network_test.go @@ -160,7 +160,6 @@ func Test_AdminNetworkCmd_Create(t *testing.T) { "--prefixes", "10.0.0.0/16,2001:db8::/32", "--destination-prefixes", strings.Join(testresources.Network1().DestinationPrefixes, ","), "--additional-announcable-cidrs", "1.2.3.4/32", - "--addressfamily", "ipv4", "--default-ipv4-prefix-length", "17", "--default-ipv6-prefix-length", "64", "--ipv4-prefix-length", "18", @@ -171,7 +170,7 @@ func Test_AdminNetworkCmd_Create(t *testing.T) { "--vrf", strconv.Itoa(int(pointer.SafeDeref(testresources.Network1().Vrf))), }, AssertExhaustiveArgs: true, - AssertExhaustiveExcludes: e2e.CommonExcludedFileArgs(), + AssertExhaustiveExcludes: append(e2e.CommonExcludedFileArgs(), "addressfamily"), NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ ClientCalls: []client.ClientCall{ { @@ -188,7 +187,7 @@ func Test_AdminNetworkCmd_Create(t *testing.T) { DestinationPrefixes: testresources.Network1().DestinationPrefixes, Vrf: new(uint32(0)), ParentNetwork: testresources.Network2().ParentNetwork, - AddressFamily: apiv2.NetworkAddressFamily_NETWORK_ADDRESS_FAMILY_V4.Enum(), + AddressFamily: nil, Labels: &apiv2.Labels{ Labels: map[string]string{"a": "b"}, }, @@ -237,7 +236,7 @@ func Test_AdminNetworkCmd_Create(t *testing.T) { ParentNetwork: testresources.Network1().ParentNetwork, AdditionalAnnouncableCidrs: testresources.Network1().AdditionalAnnouncableCidrs, Labels: testresources.Network1().Meta.Labels, - AddressFamily: apiv2.NetworkAddressFamily_NETWORK_ADDRESS_FAMILY_DUAL_STACK.Enum(), + AddressFamily: nil, }, WantResponse: func() connect.AnyResponse { return connect.NewResponse(&adminv2.NetworkServiceCreateResponse{ diff --git a/tests/e2e/admin/partition_test.go b/tests/e2e/admin/partition_test.go index 2daac45..b34dfca 100644 --- a/tests/e2e/admin/partition_test.go +++ b/tests/e2e/admin/partition_test.go @@ -1,6 +1,7 @@ package admin_e2e import ( + "fmt" "testing" "connectrpc.com/connect" @@ -11,6 +12,8 @@ import ( e2erootcmd "github.com/metal-stack/cli/testing/e2e" "github.com/metal-stack/cli/tests/e2e/testresources" e2e "github.com/metal-stack/metal-lib/pkg/genericcli/e2e" + "github.com/spf13/afero" + "github.com/stretchr/testify/require" ) func Test_AdminPartitionCmd_List(t *testing.T) { @@ -188,3 +191,80 @@ partition-1 size-1 tt.TestCmd(t) } } + +func Test_AdminPartitionCmd_Apply(t *testing.T) { + tests := []*e2e.Test[adminv2.PartitionServiceUpdateResponse, *apiv2.Partition]{ + { + Name: "apply", + CmdArgs: append([]string{"admin", "partition", "apply"}, e2e.AppendFromFileCommonArgs()...), + NewRootCmd: e2erootcmd.NewRootCmd(t, + &e2erootcmd.TestConfig{ + FsMocks: func(fs *afero.Afero) { + require.NoError(t, fs.WriteFile(e2e.InputFilePath, e2e.MustMarshal(t, testresources.Partition1()), 0755)) + }, + ClientCalls: []client.ClientCall{ + { + WantRequest: &adminv2.PartitionServiceCreateRequest{ + Partition: testresources.Partition1(), + }, + WantResponse: func() connect.AnyResponse { + return connect.NewResponse(&adminv2.PartitionServiceCreateResponse{ + Partition: testresources.Partition1(), + }) + }, + }, + }, + }), + WantTable: new(` + ID DESCRIPTION + partition-1 partition 1 + `), + }, + { + Name: "apply already exists", + CmdArgs: append([]string{"admin", "partition", "apply"}, e2e.AppendFromFileCommonArgs()...), + NewRootCmd: e2erootcmd.NewRootCmd(t, + &e2erootcmd.TestConfig{ + FsMocks: func(fs *afero.Afero) { + require.NoError(t, fs.WriteFile(e2e.InputFilePath, e2e.MustMarshal(t, testresources.Partition1()), 0755)) + }, + ClientCalls: []client.ClientCall{ + { + WantRequest: &adminv2.PartitionServiceCreateRequest{ + Partition: testresources.Partition1(), + }, + WantError: connect.NewError(connect.CodeAlreadyExists, fmt.Errorf("already exists")), + }, + { + WantRequest: &adminv2.PartitionServiceUpdateRequest{ + Id: testresources.Partition1().Id, + Description: new(testresources.Partition1().Description), + BootConfiguration: testresources.Partition1().BootConfiguration, + MgmtServiceAddresses: testresources.Partition1().MgmtServiceAddresses, + UpdateMeta: &apiv2.UpdateMeta{ + LockingStrategy: apiv2.OptimisticLockingStrategy_OPTIMISTIC_LOCKING_STRATEGY_SERVER, + }, + Labels: &apiv2.UpdateLabels{ + Strategy: &apiv2.UpdateLabels_Replace{ + Replace: testresources.Partition1().Meta.Labels, + }, + }, + }, + WantResponse: func() connect.AnyResponse { + return connect.NewResponse(&adminv2.PartitionServiceUpdateResponse{ + Partition: testresources.Partition1(), + }) + }, + }, + }, + }), + WantTable: new(` + ID DESCRIPTION + partition-1 partition 1 + `), + }, + } + for _, tt := range tests { + tt.TestCmd(t) + } +} diff --git a/tests/e2e/admin/size_test.go b/tests/e2e/admin/size_test.go index 1caaefe..b9ae447 100644 --- a/tests/e2e/admin/size_test.go +++ b/tests/e2e/admin/size_test.go @@ -1,6 +1,7 @@ package admin_e2e import ( + "fmt" "testing" "connectrpc.com/connect" @@ -155,6 +156,83 @@ func Test_AdminSizeCmd_Create(t *testing.T) { } } +func Test_AdminSizeCmd_Apply(t *testing.T) { + tests := []*e2e.Test[adminv2.SizeServiceUpdateResponse, *apiv2.Size]{ + { + Name: "apply", + CmdArgs: append([]string{"admin", "size", "apply"}, e2e.AppendFromFileCommonArgs()...), + NewRootCmd: e2erootcmd.NewRootCmd(t, + &e2erootcmd.TestConfig{ + FsMocks: func(fs *afero.Afero) { + require.NoError(t, fs.WriteFile(e2e.InputFilePath, e2e.MustMarshal(t, testresources.Size1()), 0755)) + }, + ClientCalls: []client.ClientCall{ + { + WantRequest: &adminv2.SizeServiceCreateRequest{ + Size: testresources.Size1(), + }, + WantResponse: func() connect.AnyResponse { + return connect.NewResponse(&adminv2.SizeServiceCreateResponse{ + Size: testresources.Size1(), + }) + }, + }, + }, + }), + WantTable: new(` + ID NAME DESCRIPTION CPU RANGE MEMORY RANGE STORAGE RANGE GPU RANGE + v1-medium-x86 v1-medium-x86 Virtual size for mini-lab 4 - 4 500 MB - 4.0 GB 1.0 GB - 100 GB + `), + }, + { + Name: "apply already exists", + CmdArgs: append([]string{"admin", "size", "apply"}, e2e.AppendFromFileCommonArgs()...), + NewRootCmd: e2erootcmd.NewRootCmd(t, + &e2erootcmd.TestConfig{ + FsMocks: func(fs *afero.Afero) { + require.NoError(t, fs.WriteFile(e2e.InputFilePath, e2e.MustMarshal(t, testresources.Size1()), 0755)) + }, + ClientCalls: []client.ClientCall{ + { + WantRequest: &adminv2.SizeServiceCreateRequest{ + Size: testresources.Size1(), + }, + WantError: connect.NewError(connect.CodeAlreadyExists, fmt.Errorf("already exists")), + }, + { + WantRequest: &adminv2.SizeServiceUpdateRequest{ + Id: testresources.Size1().Id, + Name: testresources.Size1().Name, + Description: testresources.Size1().Description, + UpdateMeta: &apiv2.UpdateMeta{ + LockingStrategy: apiv2.OptimisticLockingStrategy_OPTIMISTIC_LOCKING_STRATEGY_SERVER, + }, + Labels: &apiv2.UpdateLabels{ + Strategy: &apiv2.UpdateLabels_Replace{ + Replace: testresources.Size1().Meta.Labels, + }, + }, + Constraints: testresources.Size1().Constraints, + }, + WantResponse: func() connect.AnyResponse { + return connect.NewResponse(&adminv2.SizeServiceUpdateResponse{ + Size: testresources.Size1(), + }) + }, + }, + }, + }), + WantTable: new(` + ID NAME DESCRIPTION CPU RANGE MEMORY RANGE STORAGE RANGE GPU RANGE + v1-medium-x86 v1-medium-x86 Virtual size for mini-lab 4 - 4 500 MB - 4.0 GB 1.0 GB - 100 GB + `), + }, + } + for _, tt := range tests { + tt.TestCmd(t) + } +} + func Test_AdminSizeCmd_Update(t *testing.T) { tests := []*e2e.Test[adminv2.SizeServiceUpdateResponse, *apiv2.Size]{ { diff --git a/tests/e2e/admin/tenant_test.go b/tests/e2e/admin/tenant_test.go index 62cb850..fe59aeb 100644 --- a/tests/e2e/admin/tenant_test.go +++ b/tests/e2e/admin/tenant_test.go @@ -46,9 +46,11 @@ func Test_AdminTenantCmd_Create(t *testing.T) { ClientCalls: []client.ClientCall{ { WantRequest: &adminv2.TenantServiceCreateRequest{ - Name: adminTenant1().Name, - Description: new(adminTenant1().Description), - Email: new(adminTenant1().Email), + Tenant: &apiv2.TenantServiceCreateRequest{ + Name: adminTenant1().Name, + Description: new(adminTenant1().Description), + Email: new(adminTenant1().Email), + }, }, WantResponse: func() connect.AnyResponse { return connect.NewResponse(&adminv2.TenantServiceCreateResponse{ diff --git a/tests/e2e/api/filesystem_test.go b/tests/e2e/api/filesystem_test.go index e9a447c..99c2f82 100644 --- a/tests/e2e/api/filesystem_test.go +++ b/tests/e2e/api/filesystem_test.go @@ -15,7 +15,7 @@ func Test_FileSystemCmd_List(t *testing.T) { tests := []*e2e.Test[apiv2.FilesystemServiceListResponse, *apiv2.FilesystemLayout]{ { Name: "list", - CmdArgs: []string{"filesystem", "list"}, + CmdArgs: []string{"filesystemlayout", "list"}, NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ ClientCalls: []client.ClientCall{ { @@ -32,14 +32,14 @@ func Test_FileSystemCmd_List(t *testing.T) { }, }), WantTable: new(` - ID NAME DESCRIPTION SIZES IMAGES - debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 - ubuntu-raid1 Ubuntu Raid1 Raid1 layout for ubuntu machines m2.large ubuntu:>= 24.0 + ID NAME DESCRIPTION SIZES IMAGES + debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 + ubuntu-raid1 Ubuntu Raid1 Raid1 layout for ubuntu machines m2.large ubuntu:>= 24.0 `), WantWideTable: new(` - ID NAME DESCRIPTION SIZES IMAGES FILESYSTEMS DISKS RAID VOLUME GROUPS LOGICAL VOLUMES - debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 1 1 0 0 0 - ubuntu-raid1 Ubuntu Raid1 Raid1 layout for ubuntu machines m2.large ubuntu:>= 24.0 0 0 1 1 1 + ID NAME DESCRIPTION SIZES IMAGES FILESYSTEMS DISKS RAID VOLUME GROUPS LOGICAL VOLUMES + debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 1 1 0 0 0 + ubuntu-raid1 Ubuntu Raid1 Raid1 layout for ubuntu machines m2.large ubuntu:>= 24.0 0 0 1 1 1 `), Template: new("{{ .id }} {{ .name }}"), WantTemplate: new(` @@ -63,7 +63,7 @@ func Test_FileSystemCmd_Describe(t *testing.T) { tests := []*e2e.Test[apiv2.FilesystemServiceGetResponse, *apiv2.FilesystemLayout]{ { Name: "describe", - CmdArgs: []string{"filesystem", "describe", testresources.FilesystemLayout1().Id}, + CmdArgs: []string{"filesystemlayout", "describe", testresources.FilesystemLayout1().Id}, NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ ClientCalls: []client.ClientCall{ { @@ -80,12 +80,12 @@ func Test_FileSystemCmd_Describe(t *testing.T) { }), WantProtoObject: testresources.FilesystemLayout1(), WantTable: new(` - ID NAME DESCRIPTION SIZES IMAGES - debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 + ID NAME DESCRIPTION SIZES IMAGES + debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 `), WantWideTable: new(` - ID NAME DESCRIPTION SIZES IMAGES FILESYSTEMS DISKS RAID VOLUME GROUPS LOGICAL VOLUMES - debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 1 1 0 0 0 + ID NAME DESCRIPTION SIZES IMAGES FILESYSTEMS DISKS RAID VOLUME GROUPS LOGICAL VOLUMES + debian-default Debian Default Default layout for debian machines m2.small debian:>= 12.0 1 1 0 0 0 `), Template: new("{{ .id }} {{ .name }}"), WantTemplate: new(` diff --git a/tests/e2e/api/network_test.go b/tests/e2e/api/network_test.go index e7bc07e..e10eded 100644 --- a/tests/e2e/api/network_test.go +++ b/tests/e2e/api/network_test.go @@ -190,7 +190,7 @@ func Test_NetworkCmd_Create(t *testing.T) { Partition: testresources.Network1().Partition, Labels: testresources.Network1().Meta.Labels, ParentNetwork: testresources.Network1().ParentNetwork, - AddressFamily: apiv2.NetworkAddressFamily_NETWORK_ADDRESS_FAMILY_DUAL_STACK.Enum(), + AddressFamily: nil, }, WantResponse: func() connect.AnyResponse { return connect.NewResponse(&apiv2.NetworkServiceCreateResponse{ @@ -365,7 +365,7 @@ func Test_NetworkCmd_Apply(t *testing.T) { Partition: testresources.Network1().Partition, Labels: testresources.Network1().Meta.Labels, ParentNetwork: testresources.Network1().ParentNetwork, - AddressFamily: apiv2.NetworkAddressFamily_NETWORK_ADDRESS_FAMILY_DUAL_STACK.Enum(), + AddressFamily: nil, }, WantResponse: func() connect.AnyResponse { return connect.NewResponse(&apiv2.NetworkServiceCreateResponse{ @@ -397,7 +397,7 @@ func Test_NetworkCmd_Apply(t *testing.T) { Partition: testresources.Network1().Partition, Labels: testresources.Network1().Meta.Labels, ParentNetwork: testresources.Network1().ParentNetwork, - AddressFamily: apiv2.NetworkAddressFamily_NETWORK_ADDRESS_FAMILY_DUAL_STACK.Enum(), + AddressFamily: nil, }, WantError: connect.NewError(connect.CodeAlreadyExists, fmt.Errorf("already exists")), }, diff --git a/tests/e2e/api/project_test.go b/tests/e2e/api/project_test.go index 1b2864b..83b8b7c 100644 --- a/tests/e2e/api/project_test.go +++ b/tests/e2e/api/project_test.go @@ -243,6 +243,9 @@ func Test_ProjectCmd_Update(t *testing.T) { Project: testresources.Project1().Uuid, Name: new(testresources.Project1().Name), Description: new(testresources.Project1().Description), + UpdateMeta: &apiv2.UpdateMeta{ + LockingStrategy: apiv2.OptimisticLockingStrategy_OPTIMISTIC_LOCKING_STRATEGY_SERVER, + }, }, WantResponse: func() connect.AnyResponse { return connect.NewResponse(&apiv2.ProjectServiceUpdateResponse{ @@ -365,6 +368,9 @@ func Test_ProjectCmd_Apply(t *testing.T) { Project: testresources.Project1().Uuid, Description: &testresources.Project1().Description, Name: &testresources.Project1().Name, + UpdateMeta: &apiv2.UpdateMeta{ + LockingStrategy: apiv2.OptimisticLockingStrategy_OPTIMISTIC_LOCKING_STRATEGY_SERVER, + }, }, WantResponse: func() connect.AnyResponse { return connect.NewResponse(&apiv2.ProjectServiceUpdateResponse{ @@ -533,111 +539,116 @@ func Test_ProjectCmd_Join(t *testing.T) { } } -func Test_ProjectCmd_ListMembers(t *testing.T) { - tests := []*e2e.Test[apiv2.ProjectServiceGetRequest, []apiv2.ProjectMember]{ - { - Name: "list project members", - CmdArgs: []string{"project", "member", "list", "--project", testresources.Project1().Uuid}, - NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ - ClientCalls: []client.ClientCall{ - { - WantRequest: &apiv2.ProjectServiceGetRequest{ - Project: testresources.Project1().Uuid, - }, - WantResponse: func() connect.AnyResponse { - return connect.NewResponse(&apiv2.ProjectServiceGetResponse{ - Project: testresources.Project1(), - ProjectMembers: []*apiv2.ProjectMember{ - testresources.Project1Members(), testresources.Project2Members(), - }, - }) - }, - }, - }, - }), - WantTable: new(` - ID ROLE INHERITED SINCE - 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 PROJECT_ROLE_OWNER false now - 40c0da4b-9eb9-4371-91aa-1ae62193fa54 PROJECT_ROLE_EDITOR true now - `), - WantWideTable: new(` - ID ROLE INHERITED SINCE - 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 PROJECT_ROLE_OWNER false now - 40c0da4b-9eb9-4371-91aa-1ae62193fa54 PROJECT_ROLE_EDITOR true now - `), - Template: new("{{ .id }} {{ .role }}"), - WantTemplate: new(` -16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 1 -40c0da4b-9eb9-4371-91aa-1ae62193fa54 2 - `), - WantMarkdown: new(` - | ID | ROLE | INHERITED | SINCE | - |--------------------------------------|---------------------|-----------|-------| - | 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 | PROJECT_ROLE_OWNER | false | now | - | 40c0da4b-9eb9-4371-91aa-1ae62193fa54 | PROJECT_ROLE_EDITOR | true | now | - `), - }, - } - for _, tt := range tests { - tt.TestCmd(t) - } -} +// FIXME: create member tests +// func Test_ProjectCmd_ListMembers(t *testing.T) { +// tests := []*e2e.Test[apiv2.ProjectServiceGetRequest, []apiv2.ProjectMember]{ +// { +// Name: "list project members", +// CmdArgs: []string{"project", "member", "list", "--project", testresources.Project1().Uuid}, +// NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ +// ClientCalls: []client.ClientCall{ +// { +// WantRequest: &apiv2.ProjectServiceGetRequest{ +// Project: testresources.Project1().Uuid, +// }, +// WantResponse: func() connect.AnyResponse { +// return connect.NewResponse(&apiv2.ProjectServiceGetResponse{ +// Project: testresources.Project1(), +// ProjectMembers: []*apiv2.ProjectMember{ +// testresources.Project1Member(), testresources.Project2Member(), +// }, +// }) +// }, +// }, +// }, +// }), +// WantTable: new(` +// ID ROLE INHERITED SINCE +// 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 PROJECT_ROLE_OWNER false now +// 40c0da4b-9eb9-4371-91aa-1ae62193fa54 PROJECT_ROLE_EDITOR true now +// `), +// WantWideTable: new(` +// ID ROLE INHERITED SINCE +// 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 PROJECT_ROLE_OWNER false now +// 40c0da4b-9eb9-4371-91aa-1ae62193fa54 PROJECT_ROLE_EDITOR true now +// `), +// Template: new("{{ .project_member.id }} {{ .project_member.role }}"), +// WantTemplate: new(` +// 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 1 +// 40c0da4b-9eb9-4371-91aa-1ae62193fa54 2 +// `), +// WantMarkdown: new(` +// | ID | ROLE | INHERITED | SINCE | +// |--------------------------------------|---------------------|-----------|-------| +// | 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 | PROJECT_ROLE_OWNER | false | now | +// | 40c0da4b-9eb9-4371-91aa-1ae62193fa54 | PROJECT_ROLE_EDITOR | true | now | +// `), +// }, +// } +// for _, tt := range tests { +// tt.TestCmd(t) +// } +// } -func Test_ProjectCmd_DeleteMember(t *testing.T) { - tests := []*e2e.Test[apiv2.ProjectServiceRemoveMemberResponse, string]{ - { - Name: "delete project member", - CmdArgs: []string{"project", "member", "delete", testresources.Project1Members().Id, "--project", testresources.Project1().Uuid}, - NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ - ClientCalls: []client.ClientCall{ - { - WantRequest: &apiv2.ProjectServiceRemoveMemberRequest{ - Project: testresources.Project1().Uuid, - Member: testresources.Project1Members().Id, - }, - WantResponse: func() connect.AnyResponse { - return connect.NewResponse(&apiv2.ProjectServiceRemoveMemberResponse{}) - }, - }, - }, - }), - WantDefault: new(fmt.Sprintf("✔ successfully removed member \"%s\"", testresources.Project1Members().Id)), - }, - } - for _, tt := range tests { - tt.TestCmd(t) - } -} +// func Test_ProjectCmd_DeleteMember(t *testing.T) { +// tests := []*e2e.Test[apiv2.ProjectServiceRemoveMemberResponse, string]{ +// { +// Name: "delete project member", +// CmdArgs: []string{"project", "member", "delete", testresources.Project1Member().Id, "--project", testresources.Project1().Uuid}, +// NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ +// ClientCalls: []client.ClientCall{ +// { +// WantRequest: &apiv2.ProjectServiceRemoveMemberRequest{ +// Project: testresources.Project1().Uuid, +// Member: testresources.Project1Member().Id, +// }, +// WantResponse: func() connect.AnyResponse { +// return connect.NewResponse(&apiv2.ProjectServiceRemoveMemberResponse{ +// ProjectMember: testresources.Project1Member(), +// }) +// }, +// }, +// }, +// }), +// WantTable: new(` +// ID ROLE INHERITED SINCE +// 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 PROJECT_ROLE_OWNER false now +// `), +// }, +// } +// for _, tt := range tests { +// tt.TestCmd(t) +// } +// } -func Test_ProjectCmd_UpdateMember(t *testing.T) { - tests := []*e2e.Test[apiv2.ProjectServiceUpdateMemberResponse, *apiv2.ProjectMember]{ - { - Name: "update project member", - CmdArgs: []string{"project", "member", "update", testresources.Project1Members().Id, "--project", testresources.Project1().Uuid, "--role", testresources.Project1Members().Role.String()}, - NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ - ClientCalls: []client.ClientCall{ - { - WantRequest: &apiv2.ProjectServiceUpdateMemberRequest{ - Project: testresources.Project1().Uuid, - Member: testresources.Project1Members().Id, - Role: testresources.Project1Members().Role, - }, - WantResponse: func() connect.AnyResponse { - return connect.NewResponse(&apiv2.ProjectServiceUpdateMemberResponse{ - ProjectMember: testresources.Project1Members(), - }) - }, - }, - }, - }), - WantProtoObject: testresources.Project1Members(), - WantTable: new(` - ID ROLE INHERITED SINCE - 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 PROJECT_ROLE_OWNER false now - `), - }, - } - for _, tt := range tests { - tt.TestCmd(t) - } -} +// func Test_ProjectCmd_UpdateMember(t *testing.T) { +// tests := []*e2e.Test[apiv2.ProjectServiceUpdateMemberResponse, *apiv2.ProjectMember]{ +// { +// Name: "update project member", +// CmdArgs: []string{"project", "member", "update", testresources.Project1Member().Id, "--project", testresources.Project1().Uuid, "--role", testresources.Project1Member().Role.String()}, +// NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ +// ClientCalls: []client.ClientCall{ +// { +// WantRequest: &apiv2.ProjectServiceUpdateMemberRequest{ +// Project: testresources.Project1().Uuid, +// Member: testresources.Project1Member().Id, +// Role: testresources.Project1Member().Role, +// }, +// WantResponse: func() connect.AnyResponse { +// return connect.NewResponse(&apiv2.ProjectServiceUpdateMemberResponse{ +// ProjectMember: testresources.Project1Member(), +// }) +// }, +// }, +// }, +// }), +// WantTable: new(` +// ID ROLE INHERITED SINCE +// 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 PROJECT_ROLE_OWNER false now +// `), +// }, +// } +// for _, tt := range tests { +// tt.TestCmd(t) +// } +// } diff --git a/tests/e2e/api/tenant_test.go b/tests/e2e/api/tenant_test.go index d806fe0..96f995c 100644 --- a/tests/e2e/api/tenant_test.go +++ b/tests/e2e/api/tenant_test.go @@ -8,6 +8,7 @@ import ( "github.com/dustin/go-humanize" "github.com/metal-stack/api/go/client" apiv2 "github.com/metal-stack/api/go/metalstack/api/v2" + e2erootcmd "github.com/metal-stack/cli/testing/e2e" "github.com/metal-stack/cli/tests/e2e/testresources" "github.com/metal-stack/metal-lib/pkg/genericcli/e2e" @@ -143,7 +144,7 @@ func Test_TenantCmd_Create(t *testing.T) { Name: testresources.Tenant1().Name, Description: &testresources.Tenant1().Description, Email: &testresources.Tenant1().Email, - AvatarUrl: new(""), + AvatarUrl: nil, }, WantResponse: func() connect.AnyResponse { return connect.NewResponse(&apiv2.TenantServiceCreateResponse{ @@ -170,7 +171,7 @@ func Test_TenantCmd_Create(t *testing.T) { WantRequest: &apiv2.TenantServiceCreateRequest{ Name: testresources.Tenant1().Name, Description: &testresources.Tenant1().Description, - AvatarUrl: new(""), + AvatarUrl: nil, Email: &testresources.Tenant1().Email, }, WantResponse: func() connect.AnyResponse { @@ -184,7 +185,7 @@ func Test_TenantCmd_Create(t *testing.T) { Name: testresources.Tenant2().Name, Description: &testresources.Tenant2().Description, Email: &testresources.Tenant2().Email, - AvatarUrl: new(""), + AvatarUrl: nil, }, WantResponse: func() connect.AnyResponse { return connect.NewResponse(&apiv2.TenantServiceCreateResponse{ @@ -295,6 +296,9 @@ func Test_TenantCmd_Update(t *testing.T) { Name: new(testresources.Tenant1().Name), Email: new(testresources.Tenant1().Email), Description: new(testresources.Tenant1().Description), + UpdateMeta: &apiv2.UpdateMeta{ + LockingStrategy: apiv2.OptimisticLockingStrategy_OPTIMISTIC_LOCKING_STRATEGY_SERVER, + }, }, WantResponse: func() connect.AnyResponse { return connect.NewResponse(&apiv2.TenantServiceUpdateResponse{ @@ -331,7 +335,7 @@ func Test_TenantCmd_Apply(t *testing.T) { Email: new(testresources.Tenant1().Email), Description: new(testresources.Tenant1().Description), Name: testresources.Tenant1().Name, - AvatarUrl: new(""), + AvatarUrl: nil, }, WantResponse: func() connect.AnyResponse { return connect.NewResponse(&apiv2.TenantServiceCreateResponse{ @@ -361,7 +365,7 @@ func Test_TenantCmd_Apply(t *testing.T) { Email: new(testresources.Tenant1().Email), Description: new(testresources.Tenant1().Description), Name: testresources.Tenant1().Name, - AvatarUrl: new(""), + AvatarUrl: nil, }, WantError: connect.NewError(connect.CodeAlreadyExists, fmt.Errorf("already exists")), }, @@ -371,6 +375,9 @@ func Test_TenantCmd_Apply(t *testing.T) { Email: new(testresources.Tenant1().Email), Description: new(testresources.Tenant1().Description), Name: new(testresources.Tenant1().Name), + UpdateMeta: &apiv2.UpdateMeta{ + LockingStrategy: apiv2.OptimisticLockingStrategy_OPTIMISTIC_LOCKING_STRATEGY_SERVER, + }, }, WantResponse: func() connect.AnyResponse { return connect.NewResponse(&apiv2.TenantServiceUpdateResponse{ @@ -392,114 +399,199 @@ func Test_TenantCmd_Apply(t *testing.T) { } } -func Test_TenantCmd_ListMembers(t *testing.T) { - tests := []*e2e.Test[apiv2.TenantServiceGetRequest, []apiv2.TenantMember]{ - { - Name: "list tenant members", - CmdArgs: []string{"tenant", "member", "list", "--tenant", testresources.Tenant1().Login}, - NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ - ClientCalls: []client.ClientCall{ - { - WantRequest: &apiv2.TenantServiceGetRequest{ - Login: testresources.Tenant1().Login, - }, - WantResponse: func() connect.AnyResponse { - return connect.NewResponse(&apiv2.TenantServiceGetResponse{ - Tenant: testresources.Tenant1(), - TenantMembers: []*apiv2.TenantMember{ - testresources.Tenant1Members(), testresources.Tenant2Members(), - }, - }) - }, - }, - }, - }), - WantTable: new(` - ID ROLE SINCE - 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 TENANT_ROLE_OWNER now - 40c0da4b-9eb9-4371-91aa-1ae62193fa54 TENANT_ROLE_EDITOR now - `), - WantWideTable: new(` - ID ROLE SINCE - 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 TENANT_ROLE_OWNER now - 40c0da4b-9eb9-4371-91aa-1ae62193fa54 TENANT_ROLE_EDITOR now - `), - Template: new("{{ .id }} {{ .role }} {{ .projects }}"), - WantTemplate: new(` -16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 1 [0d81bca7-73f6-4da3-8397-4a8c52a0c583 f3b4e6a1-2c8d-4e5f-a7b9-1d3e5f7a9b0c] -40c0da4b-9eb9-4371-91aa-1ae62193fa54 2 [0d81bca7-73f6-4da3-8397-4a8c52a0c583] - `), - WantMarkdown: new(` - | ID | ROLE | SINCE | - |--------------------------------------|--------------------|-------| - | 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 | TENANT_ROLE_OWNER | now | - | 40c0da4b-9eb9-4371-91aa-1ae62193fa54 | TENANT_ROLE_EDITOR | now | - `), - }, - } - for _, tt := range tests { - tt.TestCmd(t) - } -} +// FIXME: create member tests +// func Test_TenantCmd_ListMembers(t *testing.T) { +// tests := []*e2e.Test[apiv2.TenantServiceGetRequest, []apiv2.TenantMember]{ +// { +// Name: "list tenant members", +// CmdArgs: []string{"tenant", "member", "list", "--tenant", testresources.Tenant1().Login}, +// NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ +// ClientCalls: []client.ClientCall{ +// { +// WantRequest: &apiv2.TenantServiceGetRequest{ +// Login: testresources.Tenant1().Login, +// }, +// WantResponse: func() connect.AnyResponse { +// return connect.NewResponse(&apiv2.TenantServiceGetResponse{ +// Tenant: testresources.Tenant1(), +// TenantMembers: []*apiv2.TenantMember{ +// testresources.Tenant1Member(), testresources.Tenant2Member(), +// }, +// }) +// }, +// }, +// }, +// }), +// WantTable: new(` +// ID ROLE SINCE +// 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 TENANT_ROLE_OWNER now +// 40c0da4b-9eb9-4371-91aa-1ae62193fa54 TENANT_ROLE_EDITOR now +// `), +// WantWideTable: new(` +// ID ROLE SINCE +// 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 TENANT_ROLE_OWNER now +// 40c0da4b-9eb9-4371-91aa-1ae62193fa54 TENANT_ROLE_EDITOR now +// `), +// Template: new("{{ .tenant_member.id }} {{ .tenant_member.role }} {{ .tenant_member.projects }}"), +// WantTemplate: new(` +// 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 1 [0d81bca7-73f6-4da3-8397-4a8c52a0c583 f3b4e6a1-2c8d-4e5f-a7b9-1d3e5f7a9b0c] +// 40c0da4b-9eb9-4371-91aa-1ae62193fa54 2 [0d81bca7-73f6-4da3-8397-4a8c52a0c583] +// `), +// WantMarkdown: new(` +// | ID | ROLE | SINCE | +// |--------------------------------------|--------------------|-------| +// | 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 | TENANT_ROLE_OWNER | now | +// | 40c0da4b-9eb9-4371-91aa-1ae62193fa54 | TENANT_ROLE_EDITOR | now | +// `), +// }, +// } +// for _, tt := range tests { +// tt.TestCmd(t) +// } +// } -func Test_TenantCmd_DeleteMember(t *testing.T) { - tests := []*e2e.Test[apiv2.TenantServiceRemoveMemberResponse, string]{ - { - Name: "delete tenant member", - CmdArgs: []string{"tenant", "member", "remove", testresources.Tenant1Members().Id, "--tenant", testresources.Tenant1().Login}, - NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ - ClientCalls: []client.ClientCall{ - { - WantRequest: &apiv2.TenantServiceRemoveMemberRequest{ - Login: testresources.Tenant1().Login, - Member: testresources.Tenant1Members().Id, - }, - WantResponse: func() connect.AnyResponse { - return connect.NewResponse(&apiv2.TenantServiceRemoveMemberResponse{}) - }, - }, - }, - }), - WantDefault: new(fmt.Sprintf("✔ successfully removed member \"%s\"", testresources.Tenant1Members().Id)), - }, - } - for _, tt := range tests { - tt.TestCmd(t) - } -} +// func Test_TenantCmd_DeleteMember(t *testing.T) { +// tests := []*e2e.Test[apiv2.TenantServiceRemoveMemberResponse, string]{ +// { +// Name: "delete tenant member", +// CmdArgs: []string{"tenant", "member", "remove", testresources.Tenant1Member().Id, "--tenant", testresources.Tenant1().Login}, +// NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ +// ClientCalls: []client.ClientCall{ +// { +// WantRequest: &apiv2.TenantServiceRemoveMemberRequest{ +// Login: testresources.Tenant1().Login, +// Member: testresources.Tenant1Member().Id, +// }, +// WantResponse: func() connect.AnyResponse { +// return connect.NewResponse(&apiv2.TenantServiceRemoveMemberResponse{ +// TenantMember: testresources.Tenant1Member(), +// }) +// }, +// }, +// }, +// }), +// WantTable: new(` +// ID ROLE SINCE +// 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 TENANT_ROLE_OWNER now +// `), +// }, +// } +// for _, tt := range tests { +// tt.TestCmd(t) +// } +// } -func Test_TenantCmd_UpdateMember(t *testing.T) { - tests := []*e2e.Test[apiv2.TenantServiceUpdateMemberResponse, *apiv2.TenantMember]{ - { - Name: "update tenant member", - CmdArgs: []string{"tenant", "member", "update", testresources.Tenant1Members().Id, "--tenant", testresources.Tenant1().Login, "--role", testresources.Tenant1Members().Role.String()}, - NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ - ClientCalls: []client.ClientCall{ - { - WantRequest: &apiv2.TenantServiceUpdateMemberRequest{ - Login: testresources.Tenant1().Login, - Member: testresources.Tenant1Members().Id, - Role: testresources.Tenant1Members().Role, - }, - WantResponse: func() connect.AnyResponse { - return connect.NewResponse(&apiv2.TenantServiceUpdateMemberResponse{ - TenantMember: testresources.Tenant1Members(), - }) - }, - }, - }, - }), - WantProtoObject: testresources.Tenant1Members(), - WantTable: new(` - ID ROLE SINCE - 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 TENANT_ROLE_OWNER now - `), - }, - } - for _, tt := range tests { - tt.TestCmd(t) - } -} +// func Test_TenantCmd_UpdateMember(t *testing.T) { +// tests := []*e2e.Test[apiv2.TenantServiceUpdateMemberResponse, *apiv2.TenantMember]{ +// { +// Name: "update tenant member", +// CmdArgs: []string{"tenant", "member", "update", testresources.Tenant1Member().Id, "--tenant", testresources.Tenant1().Login, "--role", testresources.Tenant1Member().Role.String()}, +// NewRootCmd: e2erootcmd.NewRootCmd(t, &e2erootcmd.TestConfig{ +// ClientCalls: []client.ClientCall{ +// { +// WantRequest: &apiv2.TenantServiceUpdateMemberRequest{ +// Login: testresources.Tenant1().Login, +// Member: testresources.Tenant1Member().Id, +// Role: testresources.Tenant1Member().Role, +// }, +// WantResponse: func() connect.AnyResponse { +// return connect.NewResponse(&apiv2.TenantServiceUpdateMemberResponse{ +// TenantMember: testresources.Tenant1Member(), +// }) +// }, +// }, +// }, +// }), +// WantTable: new(` +// ID ROLE SINCE +// 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 TENANT_ROLE_OWNER now +// `), +// }, +// } +// for _, tt := range tests { +// tt.TestCmd(t) +// } +// } + +// func Test_TenantCmd_ApplyMember(t *testing.T) { +// tests := []*e2e.Test[apiv2.TenantServiceUpdateMemberResponse, *apiv2.TenantMember]{ +// { +// Name: "apply", +// CmdArgs: append([]string{"tenant", "member", "apply"}, e2e.AppendFromFileCommonArgs()...), +// NewRootCmd: e2erootcmd.NewRootCmd(t, +// &e2erootcmd.TestConfig{ +// FsMocks: func(fs *afero.Afero) { +// require.NoError(t, fs.WriteFile(e2e.InputFilePath, e2e.MustMarshal(t, &apiv2.TenantMember{ +// Tenant: testresources.Tenant1().Login, +// TenantMember: testresources.Tenant1Member(), +// }), 0755)) +// }, +// ClientCalls: []client.ClientCall{ +// { +// WantRequest: &apiv2.TenantServiceAddMemberRequest{ +// Login: testresources.Tenant1().Login, +// Member: testresources.Tenant1Member().Id, +// Role: testresources.Tenant1Member().Role, +// }, +// WantResponse: func() connect.AnyResponse { +// return connect.NewResponse(&apiv2.TenantServiceAddMemberResponse{ +// TenantMember: testresources.Tenant1Member(), +// }) +// }, +// }, +// }, +// }, +// ), +// WantTable: new(` +// ID ROLE SINCE +// 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 TENANT_ROLE_OWNER now +// `), +// }, +// { +// Name: "apply already exists", +// CmdArgs: append([]string{"tenant", "member", "apply"}, e2e.AppendFromFileCommonArgs()...), +// NewRootCmd: e2erootcmd.NewRootCmd(t, +// &e2erootcmd.TestConfig{ +// FsMocks: func(fs *afero.Afero) { +// require.NoError(t, fs.WriteFile(e2e.InputFilePath, e2e.MustMarshal(t, &apiv2.TenantMember{ +// Tenant: testresources.Tenant1().Login, +// TenantMember: testresources.Tenant1Member(), +// }), 0755)) +// }, +// ClientCalls: []client.ClientCall{ +// { +// WantRequest: &apiv2.TenantServiceAddMemberRequest{ +// Login: testresources.Tenant1().Login, +// Member: testresources.Tenant1Member().Id, +// Role: testresources.Tenant1Member().Role, +// }, +// WantError: connect.NewError(connect.CodeAlreadyExists, fmt.Errorf("already exists")), +// }, +// { +// WantRequest: &apiv2.TenantServiceUpdateMemberRequest{ +// Login: testresources.Tenant1().Login, +// Member: testresources.Tenant1Member().Id, +// Role: testresources.Tenant1Member().Role, +// }, +// WantResponse: func() connect.AnyResponse { +// return connect.NewResponse(&apiv2.TenantServiceUpdateMemberResponse{ +// TenantMember: testresources.Tenant1Member(), +// }) +// }, +// }, +// }, +// }, +// ), +// WantTable: new(` +// ID ROLE SINCE +// 16d6e8ba-f574-494f-8d5e-74f6cb2d8db0 TENANT_ROLE_OWNER now +// `), +// }, +// } +// for _, tt := range tests { +// tt.TestCmd(t) +// } +// } func Test_TenantCmd_ListInvites(t *testing.T) { tests := []*e2e.Test[apiv2.TenantServiceInvitesListResponse, apiv2.TenantInvite]{ diff --git a/tests/e2e/testresources/projects.go b/tests/e2e/testresources/projects.go index 4859fc1..b72a75c 100644 --- a/tests/e2e/testresources/projects.go +++ b/tests/e2e/testresources/projects.go @@ -55,20 +55,24 @@ var ( } } - Project1Members = func() *apiv2.ProjectMember { + Project1Member = func() *apiv2.ProjectMember { return &apiv2.ProjectMember{ - Id: "16d6e8ba-f574-494f-8d5e-74f6cb2d8db0", + Member: "16d6e8ba-f574-494f-8d5e-74f6cb2d8db0", Role: apiv2.ProjectRole_PROJECT_ROLE_OWNER, InheritedMembership: false, - CreatedAt: timestamppb.New(e2e.TimeBubbleStartTime()), + Meta: &apiv2.Meta{ + CreatedAt: timestamppb.New(e2e.TimeBubbleStartTime()), + }, } } - Project2Members = func() *apiv2.ProjectMember { + Project2Member = func() *apiv2.ProjectMember { return &apiv2.ProjectMember{ - Id: "40c0da4b-9eb9-4371-91aa-1ae62193fa54", + Member: "40c0da4b-9eb9-4371-91aa-1ae62193fa54", Role: apiv2.ProjectRole_PROJECT_ROLE_EDITOR, InheritedMembership: true, - CreatedAt: timestamppb.New(e2e.TimeBubbleStartTime()), + Meta: &apiv2.Meta{ + CreatedAt: timestamppb.New(e2e.TimeBubbleStartTime()), + }, } } ) diff --git a/tests/e2e/testresources/tenants.go b/tests/e2e/testresources/tenants.go index c8eb5b4..2ea419d 100644 --- a/tests/e2e/testresources/tenants.go +++ b/tests/e2e/testresources/tenants.go @@ -57,20 +57,24 @@ var ( } } - Tenant1Members = func() *apiv2.TenantMember { + Tenant1Member = func() *apiv2.TenantMember { return &apiv2.TenantMember{ - Id: "16d6e8ba-f574-494f-8d5e-74f6cb2d8db0", - Role: apiv2.TenantRole_TENANT_ROLE_OWNER, - CreatedAt: timestamppb.New(e2e.TimeBubbleStartTime()), - Projects: []string{Project1().Uuid, Project2().Uuid}, + Member: "16d6e8ba-f574-494f-8d5e-74f6cb2d8db0", + Role: apiv2.TenantRole_TENANT_ROLE_OWNER, + Projects: []string{Project1().Uuid, Project2().Uuid}, + Meta: &apiv2.Meta{ + CreatedAt: timestamppb.New(e2e.TimeBubbleStartTime()), + }, } } - Tenant2Members = func() *apiv2.TenantMember { + Tenant2Member = func() *apiv2.TenantMember { return &apiv2.TenantMember{ - Id: "40c0da4b-9eb9-4371-91aa-1ae62193fa54", - Role: apiv2.TenantRole_TENANT_ROLE_EDITOR, - CreatedAt: timestamppb.New(e2e.TimeBubbleStartTime()), - Projects: []string{Project1().Uuid}, + Member: "40c0da4b-9eb9-4371-91aa-1ae62193fa54", + Role: apiv2.TenantRole_TENANT_ROLE_EDITOR, + Projects: []string{Project1().Uuid}, + Meta: &apiv2.Meta{ + CreatedAt: timestamppb.New(e2e.TimeBubbleStartTime()), + }, } } )