Skip to content

Commit

Permalink
IDを指定する項目でセレクタを指定可能に (#403)
Browse files Browse the repository at this point in the history
* IDを指定する項目でセレクタを指定可能に
* IDとセレクタの両方を指定可能に & 両方指定したらバリデーションで弾く
* *_idフィールドを指定した場合の警告表示
  • Loading branch information
yamamoto-febc committed Aug 30, 2022
1 parent 2c21e47 commit c292d1c
Show file tree
Hide file tree
Showing 6 changed files with 303 additions and 19 deletions.
21 changes: 18 additions & 3 deletions core/resource_def_server_group.go
Expand Up @@ -158,7 +158,22 @@ func (d *ResourceDefServerGroup) Compute(ctx *RequestContext, apiClient iaas.API
resources = append(resources, instance)
}

// セレクタ->ID変換、ゾーン非依存なので先に検索しておく
iconId, err := d.Template.FindIconId(ctx, apiClient)
if err != nil {
return nil, err
}
for len(resources) < plan.Size {
// セレクタ->ID変換
cdromId, err := d.Template.FindCDROMId(ctx, apiClient, d.Zone)
if err != nil {
return nil, err
}
privateHostId, err := d.Template.FindPrivateHostId(ctx, apiClient, d.Zone)
if err != nil {
return nil, err
}

commitment := types.Commitments.Standard
if d.Template.Plan.DedicatedCPU {
commitment = types.Commitments.DedicatedCPU
Expand All @@ -174,9 +189,9 @@ func (d *ResourceDefServerGroup) Compute(ctx *RequestContext, apiClient iaas.API
Name: serverName,
Tags: d.Template.Tags,
Description: d.Template.Description,
IconID: types.StringID(d.Template.IconID),
CDROMID: types.StringID(d.Template.CDROMID),
PrivateHostID: types.StringID(d.Template.PrivateHostID),
IconID: types.StringID(iconId),
CDROMID: types.StringID(cdromId),
PrivateHostID: types.StringID(privateHostId),
InterfaceDriver: d.Template.InterfaceDriver,
CPU: d.Template.Plan.Core,
MemoryMB: d.Template.Plan.Memory * size.GiB,
Expand Down
26 changes: 26 additions & 0 deletions core/resource_selector.go
Expand Up @@ -17,6 +17,7 @@ package core
import (
"context"
"fmt"
"strconv"

"github.com/goccy/go-yaml"
"github.com/sacloud/autoscaler/validate"
Expand Down Expand Up @@ -117,3 +118,28 @@ func (v *NameOrSelector) UnmarshalYAML(ctx context.Context, data []byte) error {
*v = NameOrSelector{ResourceSelector: selector}
return nil
}

// IdOrNameOrSelector ID、名前、またはResourceSelectorを表すstruct
type IdOrNameOrSelector struct {
ResourceSelector
}

func (v *IdOrNameOrSelector) UnmarshalYAML(ctx context.Context, data []byte) error {
var selector ResourceSelector
s := string(data)

// 数値だけの文字列だったら(ParseUintが成功したら)IDが指定されたとみなす
if _, err := strconv.ParseUint(s, 10, 64); err == nil {
selector = ResourceSelector{ID: types.StringID(s)}
} else {
// セレクタとしてUnmarshalしてみてエラーだったらNamesと見なす
if err := yaml.UnmarshalWithOptions(data, &selector, yaml.Strict()); err != nil {
selector = ResourceSelector{
Names: []string{s},
}
}
}

*v = IdOrNameOrSelector{ResourceSelector: selector}
return nil
}
38 changes: 38 additions & 0 deletions core/resource_selector_test.go
Expand Up @@ -193,3 +193,41 @@ func TestNameOrSelector_UnmarshalYAML(t *testing.T) {
})
}
}

func TestIdOrNameOrSelector_UnmarshalYAML(t *testing.T) {
tests := []struct {
name string
data []byte
want IdOrNameOrSelector
}{
{
name: "empty",
data: []byte(``),
want: IdOrNameOrSelector{ResourceSelector{}},
},
{
name: "id",
data: []byte(`123456789012`),
want: IdOrNameOrSelector{ResourceSelector{ID: 123456789012}},
},
{
name: "name",
data: []byte(`foobar`),
want: IdOrNameOrSelector{ResourceSelector{Names: []string{"foobar"}}},
},
{
name: "selector",
data: []byte(`names: ["foobar1", "foobar2"]`),
want: IdOrNameOrSelector{ResourceSelector{Names: []string{"foobar1", "foobar2"}}},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var v IdOrNameOrSelector
if err := yaml.UnmarshalWithOptions(tt.data, &v, yaml.Strict()); err != nil {
t.Fatalf("unexpected error: %s", err)
}
require.EqualValues(t, tt.want, v)
})
}
}
14 changes: 11 additions & 3 deletions core/resource_server_group_instance.go
Expand Up @@ -155,7 +155,6 @@ func (r *ResourceServerGroupInstance) computeEditParameter(ctx *RequestContext,
EnableDhcp: tmpl.EnableDHCP,
ChangePartitionUuid: tmpl.ChangePartitionUUID,
SshKeys: sshKeys,
SshKeyIds: tmpl.SSHKeyIDs,
StartupScripts: startupScripts, // Note: この段階ではGoテンプレートは未評価のまま渡す。

// これらは必要に応じてHandlerが設定する
Expand Down Expand Up @@ -195,6 +194,11 @@ func (r *ResourceServerGroupInstance) computeDisks(ctx *RequestContext) ([]*hand
if err != nil {
return nil, err
}
iconId, err := tmpl.FindIconID(ctx, r.apiClient)
if err != nil {
return nil, err
}

disks = append(disks, &handler.ServerGroupInstance_Disk{
Id: "",
Zone: r.zone,
Expand All @@ -206,7 +210,7 @@ func (r *ResourceServerGroupInstance) computeDisks(ctx *RequestContext) ([]*hand
Name: tmpl.DiskName(r.server.Name, i),
Tags: tmpl.Tags,
Description: tmpl.Description,
IconId: tmpl.IconID,
IconId: iconId,
})
}
return disks, nil
Expand Down Expand Up @@ -254,9 +258,13 @@ func (r *ResourceServerGroupInstance) computeNetworkInterfaces(ctx *RequestConte
}
}

packetFilterId, err := tmpl.FindPacketFilterId(ctx, r.apiClient, r.zone)
if err != nil {
return nil, err
}
nic := &handler.ServerGroupInstance_NIC{
Upstream: upstream,
PacketFilterId: tmpl.PacketFilterID,
PacketFilterId: packetFilterId,
ExposeInfo: exposeInfo,
}

Expand Down

0 comments on commit c292d1c

Please sign in to comment.