Skip to content

Commit

Permalink
Update metal-lib enabling deletion from file and bulk print. (#174)
Browse files Browse the repository at this point in the history
  • Loading branch information
Gerrit91 committed Jun 27, 2023
1 parent 942e5b7 commit 7f2491f
Show file tree
Hide file tree
Showing 67 changed files with 1,329 additions and 746 deletions.
8 changes: 2 additions & 6 deletions cmd/audit.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,12 +125,8 @@ func (c auditCmd) Update(_ any) (*models.V1AuditResponse, error) {
return nil, fmt.Errorf("not implemented for audit traces")
}

func (c auditCmd) ToCreate(_ *models.V1AuditResponse) (any, error) {
return nil, fmt.Errorf("not implemented for audit traces")
}

func (c auditCmd) ToUpdate(_ *models.V1AuditResponse) (any, error) {
return nil, fmt.Errorf("not implemented for audit traces")
func (c auditCmd) Convert(r *models.V1AuditResponse) (string, any, any, error) {
return "", nil, nil, fmt.Errorf("not implemented for audit traces")
}

func eventuallyRelativeDateTime(s string) (strfmt.DateTime, error) {
Expand Down
11 changes: 9 additions & 2 deletions cmd/common_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ import (
"time"

"bou.ke/monkey"
"golang.org/x/exp/slices"

"github.com/google/go-cmp/cmp"
"github.com/metal-stack/metal-go/test/client"
"github.com/metal-stack/metal-lib/pkg/pointer"
Expand All @@ -23,6 +21,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uber.org/zap/zaptest"
"golang.org/x/exp/slices"
"gopkg.in/yaml.v3"
)

Expand Down Expand Up @@ -319,3 +318,11 @@ func validateTableRows(t *testing.T, want, got string) {
}
}
}

func appendFromFileCommonArgs(args ...string) []string {
return append(args, []string{"-f", "/file.yaml", "--skip-security-prompts", "--bulk-output"}...)
}

func commonExcludedFileArgs() []string {
return []string{"file", "bulk-output", "skip-security-prompts", "timestamps"}
}
11 changes: 6 additions & 5 deletions cmd/filesystemlayout.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package cmd

import (
"errors"
"fmt"

fsmodel "github.com/metal-stack/metal-go/api/client/filesystemlayout"
"github.com/metal-stack/metal-go/api/models"
Expand Down Expand Up @@ -118,12 +119,12 @@ func (c fslCmd) Update(rq *models.V1FilesystemLayoutUpdateRequest) (*models.V1Fi
return resp.Payload, nil
}

func (c fslCmd) ToCreate(r *models.V1FilesystemLayoutResponse) (*models.V1FilesystemLayoutCreateRequest, error) {
return filesystemLayoutResponseToCreate(r), nil
}
func (c fslCmd) Convert(r *models.V1FilesystemLayoutResponse) (string, *models.V1FilesystemLayoutCreateRequest, *models.V1FilesystemLayoutUpdateRequest, error) {
if r.ID == nil {
return "", nil, nil, fmt.Errorf("id is nil")
}

func (c fslCmd) ToUpdate(r *models.V1FilesystemLayoutResponse) (*models.V1FilesystemLayoutUpdateRequest, error) {
return filesystemLayoutResponseToUpdate(r), nil
return *r.ID, filesystemLayoutResponseToCreate(r), filesystemLayoutResponseToUpdate(r), nil
}

func filesystemLayoutResponseToCreate(r *models.V1FilesystemLayoutResponse) *models.V1FilesystemLayoutCreateRequest {
Expand Down
93 changes: 58 additions & 35 deletions cmd/filesystemlayout_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ ID DESCRIPTION FILESYSTEMS SIZES IMAGES
{
name: "apply",
cmd: func(want []*models.V1FilesystemLayoutResponse) []string {
return []string{"fsl", "apply", "-f", "/file.yaml"}
return appendFromFileCommonArgs("fsl", "apply")
},
fsMocks: func(fs afero.Fs, want []*models.V1FilesystemLayoutResponse) {
require.NoError(t, afero.WriteFile(fs, "/file.yaml", mustMarshalToMultiYAML(t, want), 0755))
Expand All @@ -197,6 +197,63 @@ ID DESCRIPTION FILESYSTEMS SIZES IMAGES
fsl2,
},
},
{
name: "create from file",
cmd: func(want []*models.V1FilesystemLayoutResponse) []string {
return appendFromFileCommonArgs("fsl", "create")
},
fsMocks: func(fs afero.Fs, want []*models.V1FilesystemLayoutResponse) {
require.NoError(t, afero.WriteFile(fs, "/file.yaml", mustMarshalToMultiYAML(t, want), 0755))
},
mocks: &client.MetalMockFns{
Filesystemlayout: func(mock *mock.Mock) {
mock.On("CreateFilesystemLayout", testcommon.MatchIgnoreContext(t, fsmodel.NewCreateFilesystemLayoutParams().WithBody(filesystemLayoutResponseToCreate(fsl1))), nil).Return(&fsmodel.CreateFilesystemLayoutCreated{
Payload: fsl1,
}, nil)
},
},
want: []*models.V1FilesystemLayoutResponse{
fsl1,
},
},
{
name: "update from file",
cmd: func(want []*models.V1FilesystemLayoutResponse) []string {
return appendFromFileCommonArgs("fsl", "update")
},
fsMocks: func(fs afero.Fs, want []*models.V1FilesystemLayoutResponse) {
require.NoError(t, afero.WriteFile(fs, "/file.yaml", mustMarshalToMultiYAML(t, want), 0755))
},
mocks: &client.MetalMockFns{
Filesystemlayout: func(mock *mock.Mock) {
mock.On("UpdateFilesystemLayout", testcommon.MatchIgnoreContext(t, fsmodel.NewUpdateFilesystemLayoutParams().WithBody(filesystemLayoutResponseToUpdate(fsl1))), nil).Return(&fsmodel.UpdateFilesystemLayoutOK{
Payload: fsl1,
}, nil)
},
},
want: []*models.V1FilesystemLayoutResponse{
fsl1,
},
},
{
name: "delete from file",
cmd: func(want []*models.V1FilesystemLayoutResponse) []string {
return appendFromFileCommonArgs("fsl", "delete")
},
fsMocks: func(fs afero.Fs, want []*models.V1FilesystemLayoutResponse) {
require.NoError(t, afero.WriteFile(fs, "/file.yaml", mustMarshalToMultiYAML(t, want), 0755))
},
mocks: &client.MetalMockFns{
Filesystemlayout: func(mock *mock.Mock) {
mock.On("DeleteFilesystemLayout", testcommon.MatchIgnoreContext(t, fsmodel.NewDeleteFilesystemLayoutParams().WithID(*fsl1.ID)), nil).Return(&fsmodel.DeleteFilesystemLayoutOK{
Payload: fsl1,
}, nil)
},
},
want: []*models.V1FilesystemLayoutResponse{
fsl1,
},
},
}
for _, tt := range tests {
tt.testCmd(t)
Expand Down Expand Up @@ -253,40 +310,6 @@ ID DESCRIPTION FILESYSTEMS SIZES IMAGES
},
want: fsl1,
},
{
name: "create from file",
cmd: func(want *models.V1FilesystemLayoutResponse) []string {
return []string{"fsl", "create", "-f", "/file.yaml"}
},
fsMocks: func(fs afero.Fs, want *models.V1FilesystemLayoutResponse) {
require.NoError(t, afero.WriteFile(fs, "/file.yaml", mustMarshal(t, want), 0755))
},
mocks: &client.MetalMockFns{
Filesystemlayout: func(mock *mock.Mock) {
mock.On("CreateFilesystemLayout", testcommon.MatchIgnoreContext(t, fsmodel.NewCreateFilesystemLayoutParams().WithBody(filesystemLayoutResponseToCreate(fsl1))), nil).Return(&fsmodel.CreateFilesystemLayoutCreated{
Payload: fsl1,
}, nil)
},
},
want: fsl1,
},
{
name: "update from file",
cmd: func(want *models.V1FilesystemLayoutResponse) []string {
return []string{"fsl", "update", "-f", "/file.yaml"}
},
fsMocks: func(fs afero.Fs, want *models.V1FilesystemLayoutResponse) {
require.NoError(t, afero.WriteFile(fs, "/file.yaml", mustMarshal(t, want), 0755))
},
mocks: &client.MetalMockFns{
Filesystemlayout: func(mock *mock.Mock) {
mock.On("UpdateFilesystemLayout", testcommon.MatchIgnoreContext(t, fsmodel.NewUpdateFilesystemLayoutParams().WithBody(filesystemLayoutResponseToUpdate(fsl1))), nil).Return(&fsmodel.UpdateFilesystemLayoutOK{
Payload: fsl1,
}, nil)
},
},
want: fsl1,
},
}
for _, tt := range tests {
tt.testCmd(t)
Expand Down
11 changes: 5 additions & 6 deletions cmd/firewall.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,12 +129,11 @@ func (c firewallCmd) Update(rq any) (*models.V1FirewallResponse, error) {
return nil, fmt.Errorf("firewall entity does not support update operation, use machine update")
}

func (c firewallCmd) ToCreate(r *models.V1FirewallResponse) (*models.V1FirewallCreateRequest, error) {
return firewallResponseToCreate(r), nil
}

func (c firewallCmd) ToUpdate(r *models.V1FirewallResponse) (any, error) {
return nil, fmt.Errorf("firewall entity does not support update operation, use machine update")
func (c firewallCmd) Convert(r *models.V1FirewallResponse) (string, *models.V1FirewallCreateRequest, any, error) {
if r.ID == nil {
return "", nil, nil, fmt.Errorf("id is nil")
}
return *r.ID, firewallResponseToCreate(r), nil, nil
}

func firewallResponseToCreate(r *models.V1FirewallResponse) *models.V1FirewallCreateRequest {
Expand Down
2 changes: 1 addition & 1 deletion cmd/firewall_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ ID AGE HOSTNAME PROJECT NETWORKS IPS PARTITION
"--tags", strings.Join(want.Tags, ","),
"--userdata", want.Allocation.UserData,
}
assertExhaustiveArgs(t, args, "file")
assertExhaustiveArgs(t, args, commonExcludedFileArgs()...)
return args
},
mocks: &client.MetalMockFns{
Expand Down
12 changes: 6 additions & 6 deletions cmd/image.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package cmd

import (
"errors"
"fmt"

"github.com/metal-stack/metal-go/api/client/image"
"github.com/metal-stack/metal-go/api/models"
Expand Down Expand Up @@ -129,12 +130,11 @@ func (c imageCmd) Update(rq *models.V1ImageUpdateRequest) (*models.V1ImageRespon
return resp.Payload, nil
}

func (c imageCmd) ToCreate(r *models.V1ImageResponse) (*models.V1ImageCreateRequest, error) {
return imageResponseToCreate(r), nil
}

func (c imageCmd) ToUpdate(r *models.V1ImageResponse) (*models.V1ImageUpdateRequest, error) {
return imageResponseToUpdate(r), nil
func (c imageCmd) Convert(r *models.V1ImageResponse) (string, *models.V1ImageCreateRequest, *models.V1ImageUpdateRequest, error) {
if r.ID == nil {
return "", nil, nil, fmt.Errorf("id is nil")
}
return *r.ID, imageResponseToCreate(r), imageResponseToUpdate(r), nil
}

func imageResponseToCreate(r *models.V1ImageResponse) *models.V1ImageCreateRequest {
Expand Down
95 changes: 59 additions & 36 deletions cmd/image_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ debian debian-name
{
name: "apply",
cmd: func(want []*models.V1ImageResponse) []string {
return []string{"image", "apply", "-f", "/file.yaml"}
return appendFromFileCommonArgs("image", "apply")
},
fsMocks: func(fs afero.Fs, want []*models.V1ImageResponse) {
require.NoError(t, afero.WriteFile(fs, "/file.yaml", mustMarshalToMultiYAML(t, want), 0755))
Expand All @@ -160,6 +160,63 @@ debian debian-name
image2,
},
},
{
name: "create from file",
cmd: func(want []*models.V1ImageResponse) []string {
return appendFromFileCommonArgs("image", "create")
},
fsMocks: func(fs afero.Fs, want []*models.V1ImageResponse) {
require.NoError(t, afero.WriteFile(fs, "/file.yaml", mustMarshalToMultiYAML(t, want), 0755))
},
mocks: &client.MetalMockFns{
Image: func(mock *mock.Mock) {
mock.On("CreateImage", testcommon.MatchIgnoreContext(t, image.NewCreateImageParams().WithBody(imageResponseToCreate(image1)), testcommon.StrFmtDateComparer()), nil).Return(&image.CreateImageCreated{
Payload: image1,
}, nil)
},
},
want: []*models.V1ImageResponse{
image1,
},
},
{
name: "update from file",
cmd: func(want []*models.V1ImageResponse) []string {
return appendFromFileCommonArgs("image", "update")
},
fsMocks: func(fs afero.Fs, want []*models.V1ImageResponse) {
require.NoError(t, afero.WriteFile(fs, "/file.yaml", mustMarshalToMultiYAML(t, want), 0755))
},
mocks: &client.MetalMockFns{
Image: func(mock *mock.Mock) {
mock.On("UpdateImage", testcommon.MatchIgnoreContext(t, image.NewUpdateImageParams().WithBody(imageResponseToUpdate(image1)), testcommon.StrFmtDateComparer()), nil).Return(&image.UpdateImageOK{
Payload: image1,
}, nil)
},
},
want: []*models.V1ImageResponse{
image1,
},
},
{
name: "delete from file",
cmd: func(want []*models.V1ImageResponse) []string {
return appendFromFileCommonArgs("image", "delete")
},
fsMocks: func(fs afero.Fs, want []*models.V1ImageResponse) {
require.NoError(t, afero.WriteFile(fs, "/file.yaml", mustMarshalToMultiYAML(t, want), 0755))
},
mocks: &client.MetalMockFns{
Image: func(mock *mock.Mock) {
mock.On("DeleteImage", testcommon.MatchIgnoreContext(t, image.NewDeleteImageParams().WithID(*image1.ID)), nil).Return(&image.DeleteImageOK{
Payload: image1,
}, nil)
},
},
want: []*models.V1ImageResponse{
image1,
},
},
}
for _, tt := range tests {
tt.testCmd(t)
Expand Down Expand Up @@ -223,7 +280,7 @@ debian debian-name
"--url", want.URL,
"--features", want.Features[0],
}
assertExhaustiveArgs(t, args, "file")
assertExhaustiveArgs(t, args, commonExcludedFileArgs()...)
return args
},
mocks: &client.MetalMockFns{
Expand All @@ -238,40 +295,6 @@ debian debian-name
},
want: image1,
},
{
name: "create from file",
cmd: func(want *models.V1ImageResponse) []string {
return []string{"image", "create", "-f", "/file.yaml"}
},
fsMocks: func(fs afero.Fs, want *models.V1ImageResponse) {
require.NoError(t, afero.WriteFile(fs, "/file.yaml", mustMarshal(t, want), 0755))
},
mocks: &client.MetalMockFns{
Image: func(mock *mock.Mock) {
mock.On("CreateImage", testcommon.MatchIgnoreContext(t, image.NewCreateImageParams().WithBody(imageResponseToCreate(image1)), testcommon.StrFmtDateComparer()), nil).Return(&image.CreateImageCreated{
Payload: image1,
}, nil)
},
},
want: image1,
},
{
name: "update from file",
cmd: func(want *models.V1ImageResponse) []string {
return []string{"image", "update", "-f", "/file.yaml"}
},
fsMocks: func(fs afero.Fs, want *models.V1ImageResponse) {
require.NoError(t, afero.WriteFile(fs, "/file.yaml", mustMarshal(t, want), 0755))
},
mocks: &client.MetalMockFns{
Image: func(mock *mock.Mock) {
mock.On("UpdateImage", testcommon.MatchIgnoreContext(t, image.NewUpdateImageParams().WithBody(imageResponseToUpdate(image1))), nil).Return(&image.UpdateImageOK{
Payload: image1,
}, nil)
},
},
want: image1,
},
}
for _, tt := range tests {
tt.testCmd(t)
Expand Down
11 changes: 5 additions & 6 deletions cmd/ip.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,12 +158,11 @@ func (c ipCmd) Update(rq *models.V1IPUpdateRequest) (*models.V1IPResponse, error
return resp.Payload, nil
}

func (c ipCmd) ToCreate(r *models.V1IPResponse) (*ipAllocateRequest, error) {
return ipResponseToCreate(r), nil
}

func (c ipCmd) ToUpdate(r *models.V1IPResponse) (*models.V1IPUpdateRequest, error) {
return ipResponseToUpdate(r), nil
func (c ipCmd) Convert(r *models.V1IPResponse) (string, *ipAllocateRequest, *models.V1IPUpdateRequest, error) {
if r.Ipaddress == nil {
return "", nil, nil, fmt.Errorf("ipaddress is nil")
}
return *r.Ipaddress, ipResponseToCreate(r), ipResponseToUpdate(r), nil
}

func ipResponseToCreate(r *models.V1IPResponse) *ipAllocateRequest {
Expand Down
Loading

0 comments on commit 7f2491f

Please sign in to comment.