From e33b64aacb8f9336c1469fadd08d529927592656 Mon Sep 17 00:00:00 2001 From: Gabriel Adrian Samfira Date: Sun, 23 Jul 2023 12:47:56 +0000 Subject: [PATCH] Providers now return ProviderInstance{} Signed-off-by: Gabriel Adrian Samfira --- go.mod | 2 +- go.sum | 8 +++++ runner/common/mocks/Provider.go | 30 +++++++++---------- runner/common/provider.go | 6 ++-- runner/pool/pool.go | 12 ++++---- runner/providers/external/external.go | 28 ++++++++--------- runner/providers/external/util.go | 5 ++-- runner/providers/lxd/lxd.go | 28 ++++++++--------- runner/providers/lxd/util.go | 11 ++++--- .../garm-provider-common/params/params.go | 4 +++ .../garm-provider-common/util/exec/exec.go | 25 ++++++++++++++++ .../util/exec/exec_nix.go | 12 ++++++++ .../util/exec/exec_windows.go | 18 +++++++++++ vendor/modules.txt | 2 +- 14 files changed, 128 insertions(+), 63 deletions(-) create mode 100644 vendor/github.com/cloudbase/garm-provider-common/util/exec/exec.go create mode 100644 vendor/github.com/cloudbase/garm-provider-common/util/exec/exec_nix.go create mode 100644 vendor/github.com/cloudbase/garm-provider-common/util/exec/exec_windows.go diff --git a/go.mod b/go.mod index de90d683..124e1dd5 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.20 require ( github.com/BurntSushi/toml v1.2.1 - github.com/cloudbase/garm-provider-common v0.0.0-20230722221640-5f53e8404727 + github.com/cloudbase/garm-provider-common v0.0.0-20230723124240-9ad9282807e5 github.com/go-openapi/errors v0.20.4 github.com/go-openapi/runtime v0.26.0 github.com/go-openapi/strfmt v0.21.7 diff --git a/go.sum b/go.sum index 250188eb..4a50bad4 100644 --- a/go.sum +++ b/go.sum @@ -27,6 +27,8 @@ github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudbase/garm-provider-common v0.0.0-20230722221640-5f53e8404727 h1:/xosrBTRvakPPFBEzfZGruD0TXI5zy0q1ACu/jplbZk= github.com/cloudbase/garm-provider-common v0.0.0-20230722221640-5f53e8404727/go.mod h1:RKzgL0MXkNeGfloQpE2swz/y4LWJr5+2Wd45bSXPB0k= +github.com/cloudbase/garm-provider-common v0.0.0-20230723124240-9ad9282807e5 h1:x0Z4i2ep2xos2I/qBkk/b9RNebufpY+l4GwJQaIAQyA= +github.com/cloudbase/garm-provider-common v0.0.0-20230723124240-9ad9282807e5/go.mod h1:RKzgL0MXkNeGfloQpE2swz/y4LWJr5+2Wd45bSXPB0k= github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= @@ -48,6 +50,7 @@ github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03D github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -188,6 +191,8 @@ github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/ github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/juju/clock v1.0.3 h1:yJHIsWXeU8j3QcBdiess09SzfiXRRrsjKPn2whnMeds= github.com/juju/clock v1.0.3/go.mod h1:HIBvJ8kiV/n7UHwKuCkdYL4l/MDECztHR2sAvWDxxf0= github.com/juju/errors v1.0.0 h1:yiq7kjCLll1BiaRuNY53MGI0+EQ3rF6GB+wvboZDefM= @@ -248,7 +253,10 @@ github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6FxaNu/BnU2OAaLF86eTVhP2hjTB6iMvItA= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= diff --git a/runner/common/mocks/Provider.go b/runner/common/mocks/Provider.go index ca8bddcf..e5157e0f 100644 --- a/runner/common/mocks/Provider.go +++ b/runner/common/mocks/Provider.go @@ -31,18 +31,18 @@ func (_m *Provider) AsParams() params.Provider { } // CreateInstance provides a mock function with given fields: ctx, bootstrapParams -func (_m *Provider) CreateInstance(ctx context.Context, bootstrapParams garm_provider_commonparams.BootstrapInstance) (params.Instance, error) { +func (_m *Provider) CreateInstance(ctx context.Context, bootstrapParams garm_provider_commonparams.BootstrapInstance) (garm_provider_commonparams.ProviderInstance, error) { ret := _m.Called(ctx, bootstrapParams) - var r0 params.Instance + var r0 garm_provider_commonparams.ProviderInstance var r1 error - if rf, ok := ret.Get(0).(func(context.Context, garm_provider_commonparams.BootstrapInstance) (params.Instance, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, garm_provider_commonparams.BootstrapInstance) (garm_provider_commonparams.ProviderInstance, error)); ok { return rf(ctx, bootstrapParams) } - if rf, ok := ret.Get(0).(func(context.Context, garm_provider_commonparams.BootstrapInstance) params.Instance); ok { + if rf, ok := ret.Get(0).(func(context.Context, garm_provider_commonparams.BootstrapInstance) garm_provider_commonparams.ProviderInstance); ok { r0 = rf(ctx, bootstrapParams) } else { - r0 = ret.Get(0).(params.Instance) + r0 = ret.Get(0).(garm_provider_commonparams.ProviderInstance) } if rf, ok := ret.Get(1).(func(context.Context, garm_provider_commonparams.BootstrapInstance) error); ok { @@ -69,18 +69,18 @@ func (_m *Provider) DeleteInstance(ctx context.Context, instance string) error { } // GetInstance provides a mock function with given fields: ctx, instance -func (_m *Provider) GetInstance(ctx context.Context, instance string) (params.Instance, error) { +func (_m *Provider) GetInstance(ctx context.Context, instance string) (garm_provider_commonparams.ProviderInstance, error) { ret := _m.Called(ctx, instance) - var r0 params.Instance + var r0 garm_provider_commonparams.ProviderInstance var r1 error - if rf, ok := ret.Get(0).(func(context.Context, string) (params.Instance, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, string) (garm_provider_commonparams.ProviderInstance, error)); ok { return rf(ctx, instance) } - if rf, ok := ret.Get(0).(func(context.Context, string) params.Instance); ok { + if rf, ok := ret.Get(0).(func(context.Context, string) garm_provider_commonparams.ProviderInstance); ok { r0 = rf(ctx, instance) } else { - r0 = ret.Get(0).(params.Instance) + r0 = ret.Get(0).(garm_provider_commonparams.ProviderInstance) } if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { @@ -93,19 +93,19 @@ func (_m *Provider) GetInstance(ctx context.Context, instance string) (params.In } // ListInstances provides a mock function with given fields: ctx, poolID -func (_m *Provider) ListInstances(ctx context.Context, poolID string) ([]params.Instance, error) { +func (_m *Provider) ListInstances(ctx context.Context, poolID string) ([]garm_provider_commonparams.ProviderInstance, error) { ret := _m.Called(ctx, poolID) - var r0 []params.Instance + var r0 []garm_provider_commonparams.ProviderInstance var r1 error - if rf, ok := ret.Get(0).(func(context.Context, string) ([]params.Instance, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, string) ([]garm_provider_commonparams.ProviderInstance, error)); ok { return rf(ctx, poolID) } - if rf, ok := ret.Get(0).(func(context.Context, string) []params.Instance); ok { + if rf, ok := ret.Get(0).(func(context.Context, string) []garm_provider_commonparams.ProviderInstance); ok { r0 = rf(ctx, poolID) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]params.Instance) + r0 = ret.Get(0).([]garm_provider_commonparams.ProviderInstance) } } diff --git a/runner/common/provider.go b/runner/common/provider.go index f62dc77b..1cdb7fbe 100644 --- a/runner/common/provider.go +++ b/runner/common/provider.go @@ -24,13 +24,13 @@ import ( //go:generate mockery --all type Provider interface { // CreateInstance creates a new compute instance in the provider. - CreateInstance(ctx context.Context, bootstrapParams commonParams.BootstrapInstance) (params.Instance, error) + CreateInstance(ctx context.Context, bootstrapParams commonParams.BootstrapInstance) (commonParams.ProviderInstance, error) // Delete instance will delete the instance in a provider. DeleteInstance(ctx context.Context, instance string) error // GetInstance will return details about one instance. - GetInstance(ctx context.Context, instance string) (params.Instance, error) + GetInstance(ctx context.Context, instance string) (commonParams.ProviderInstance, error) // ListInstances will list all instances for a provider. - ListInstances(ctx context.Context, poolID string) ([]params.Instance, error) + ListInstances(ctx context.Context, poolID string) ([]commonParams.ProviderInstance, error) // RemoveAllInstances will remove all instances created by this provider. RemoveAllInstances(ctx context.Context) error // Stop shuts down the instance. diff --git a/runner/pool/pool.go b/runner/pool/pool.go index e0dd3a03..a2516605 100644 --- a/runner/pool/pool.go +++ b/runner/pool/pool.go @@ -467,13 +467,13 @@ func (r *basePoolManager) reapTimedOutRunners(runners []*github.Runner) error { return nil } -func instanceInList(instanceName string, instances []params.Instance) (params.Instance, bool) { +func instanceInList(instanceName string, instances []commonParams.ProviderInstance) (commonParams.ProviderInstance, bool) { for _, val := range instances { if val.Name == instanceName { return val, true } } - return params.Instance{}, false + return commonParams.ProviderInstance{}, false } // cleanupOrphanedGithubRunners will forcefully remove any github runners that appear @@ -481,7 +481,7 @@ func instanceInList(instanceName string, instances []params.Instance) (params.In // This may happen if someone manually deletes the instance in the provider. We need to // first remove the instance from github, and then from our database. func (r *basePoolManager) cleanupOrphanedGithubRunners(runners []*github.Runner) error { - poolInstanceCache := map[string][]params.Instance{} + poolInstanceCache := map[string][]commonParams.ProviderInstance{} g, ctx := errgroup.WithContext(r.ctx) for _, runner := range runners { if !r.isManagedRunner(labelsFromRunner(runner)) { @@ -532,7 +532,7 @@ func (r *basePoolManager) cleanupOrphanedGithubRunners(runners []*github.Runner) return fmt.Errorf("unknown provider %s for pool %s", pool.ProviderName, pool.ID) } - var poolInstances []params.Instance + var poolInstances []commonParams.ProviderInstance poolInstances, ok = poolInstanceCache[pool.ID] if !ok { r.log("updating instances cache for pool %s", pool.ID) @@ -911,17 +911,17 @@ func (r *basePoolManager) controllerLabel() string { return fmt.Sprintf("%s%s", controllerLabelPrefix, r.controllerID) } -func (r *basePoolManager) updateArgsFromProviderInstance(providerInstance params.Instance) params.UpdateInstanceParams { +func (r *basePoolManager) updateArgsFromProviderInstance(providerInstance commonParams.ProviderInstance) params.UpdateInstanceParams { return params.UpdateInstanceParams{ ProviderID: providerInstance.ProviderID, OSName: providerInstance.OSName, OSVersion: providerInstance.OSVersion, Addresses: providerInstance.Addresses, Status: providerInstance.Status, - RunnerStatus: providerInstance.RunnerStatus, ProviderFault: providerInstance.ProviderFault, } } + func (r *basePoolManager) scaleDownOnePool(ctx context.Context, pool params.Pool) error { r.log("scaling down pool %s", pool.ID) if !pool.Enabled { diff --git a/runner/providers/external/external.go b/runner/providers/external/external.go index edeccdf0..838f7f6d 100644 --- a/runner/providers/external/external.go +++ b/runner/providers/external/external.go @@ -67,7 +67,7 @@ func (e *external) validateResult(inst commonParams.ProviderInstance) error { } // CreateInstance creates a new compute instance in the provider. -func (e *external) CreateInstance(ctx context.Context, bootstrapParams commonParams.BootstrapInstance) (params.Instance, error) { +func (e *external) CreateInstance(ctx context.Context, bootstrapParams commonParams.BootstrapInstance) (commonParams.ProviderInstance, error) { asEnv := []string{ fmt.Sprintf("GARM_COMMAND=%s", execution.CreateInstanceCommand), fmt.Sprintf("GARM_CONTROLLER_ID=%s", e.controllerID), @@ -77,21 +77,21 @@ func (e *external) CreateInstance(ctx context.Context, bootstrapParams commonPar asJs, err := json.Marshal(bootstrapParams) if err != nil { - return params.Instance{}, errors.Wrap(err, "serializing bootstrap params") + return commonParams.ProviderInstance{}, errors.Wrap(err, "serializing bootstrap params") } out, err := garmExec.Exec(ctx, e.execPath, asJs, asEnv) if err != nil { - return params.Instance{}, garmErrors.NewProviderError("provider binary %s returned error: %s", e.execPath, err) + return commonParams.ProviderInstance{}, garmErrors.NewProviderError("provider binary %s returned error: %s", e.execPath, err) } var param commonParams.ProviderInstance if err := json.Unmarshal(out, ¶m); err != nil { - return params.Instance{}, garmErrors.NewProviderError("failed to decode response from binary: %s", err) + return commonParams.ProviderInstance{}, garmErrors.NewProviderError("failed to decode response from binary: %s", err) } if err := e.validateResult(param); err != nil { - return params.Instance{}, garmErrors.NewProviderError("failed to validate result: %s", err) + return commonParams.ProviderInstance{}, garmErrors.NewProviderError("failed to validate result: %s", err) } retAsJs, _ := json.MarshalIndent(param, "", " ") @@ -120,7 +120,7 @@ func (e *external) DeleteInstance(ctx context.Context, instance string) error { } // GetInstance will return details about one instance. -func (e *external) GetInstance(ctx context.Context, instance string) (params.Instance, error) { +func (e *external) GetInstance(ctx context.Context, instance string) (commonParams.ProviderInstance, error) { asEnv := []string{ fmt.Sprintf("GARM_COMMAND=%s", execution.GetInstanceCommand), fmt.Sprintf("GARM_CONTROLLER_ID=%s", e.controllerID), @@ -132,23 +132,23 @@ func (e *external) GetInstance(ctx context.Context, instance string) (params.Ins // know when the error is ErrNotFound. out, err := garmExec.Exec(ctx, e.execPath, nil, asEnv) if err != nil { - return params.Instance{}, garmErrors.NewProviderError("provider binary %s returned error: %s", e.execPath, err) + return commonParams.ProviderInstance{}, garmErrors.NewProviderError("provider binary %s returned error: %s", e.execPath, err) } var param commonParams.ProviderInstance if err := json.Unmarshal(out, ¶m); err != nil { - return params.Instance{}, garmErrors.NewProviderError("failed to decode response from binary: %s", err) + return commonParams.ProviderInstance{}, garmErrors.NewProviderError("failed to decode response from binary: %s", err) } if err := e.validateResult(param); err != nil { - return params.Instance{}, garmErrors.NewProviderError("failed to validate result: %s", err) + return commonParams.ProviderInstance{}, garmErrors.NewProviderError("failed to validate result: %s", err) } return providerInstanceToParamsInstance(param), nil } // ListInstances will list all instances for a provider. -func (e *external) ListInstances(ctx context.Context, poolID string) ([]params.Instance, error) { +func (e *external) ListInstances(ctx context.Context, poolID string) ([]commonParams.ProviderInstance, error) { asEnv := []string{ fmt.Sprintf("GARM_COMMAND=%s", execution.ListInstancesCommand), fmt.Sprintf("GARM_CONTROLLER_ID=%s", e.controllerID), @@ -158,18 +158,18 @@ func (e *external) ListInstances(ctx context.Context, poolID string) ([]params.I out, err := garmExec.Exec(ctx, e.execPath, nil, asEnv) if err != nil { - return []params.Instance{}, garmErrors.NewProviderError("provider binary %s returned error: %s", e.execPath, err) + return []commonParams.ProviderInstance{}, garmErrors.NewProviderError("provider binary %s returned error: %s", e.execPath, err) } var param []commonParams.ProviderInstance if err := json.Unmarshal(out, ¶m); err != nil { - return []params.Instance{}, garmErrors.NewProviderError("failed to decode response from binary: %s", err) + return []commonParams.ProviderInstance{}, garmErrors.NewProviderError("failed to decode response from binary: %s", err) } - ret := make([]params.Instance, len(param)) + ret := make([]commonParams.ProviderInstance, len(param)) for idx, inst := range param { if err := e.validateResult(inst); err != nil { - return []params.Instance{}, garmErrors.NewProviderError("failed to validate result: %s", err) + return []commonParams.ProviderInstance{}, garmErrors.NewProviderError("failed to validate result: %s", err) } ret[idx] = providerInstanceToParamsInstance(inst) } diff --git a/runner/providers/external/util.go b/runner/providers/external/util.go index ec9c5e84..e151dbc4 100644 --- a/runner/providers/external/util.go +++ b/runner/providers/external/util.go @@ -2,7 +2,6 @@ package external import ( commonParams "github.com/cloudbase/garm-provider-common/params" - "github.com/cloudbase/garm/params" ) // IsProviderValidStatus checks if the given status is valid for the provider. @@ -21,8 +20,8 @@ func IsValidProviderStatus(status commonParams.InstanceStatus) bool { } } -func providerInstanceToParamsInstance(inst commonParams.ProviderInstance) params.Instance { - return params.Instance{ +func providerInstanceToParamsInstance(inst commonParams.ProviderInstance) commonParams.ProviderInstance { + return commonParams.ProviderInstance{ ProviderID: inst.ProviderID, Name: inst.Name, OSName: inst.OSName, diff --git a/runner/providers/lxd/lxd.go b/runner/providers/lxd/lxd.go index 530ec74b..39f34bb4 100644 --- a/runner/providers/lxd/lxd.go +++ b/runner/providers/lxd/lxd.go @@ -315,40 +315,40 @@ func (l *LXD) launchInstance(createArgs api.InstancesPost) error { } // CreateInstance creates a new compute instance in the provider. -func (l *LXD) CreateInstance(ctx context.Context, bootstrapParams commonParams.BootstrapInstance) (params.Instance, error) { +func (l *LXD) CreateInstance(ctx context.Context, bootstrapParams commonParams.BootstrapInstance) (commonParams.ProviderInstance, error) { extraSpecs, err := parseExtraSpecsFromBootstrapParams(bootstrapParams) if err != nil { - return params.Instance{}, errors.Wrap(err, "parsing extra specs") + return commonParams.ProviderInstance{}, errors.Wrap(err, "parsing extra specs") } args, err := l.getCreateInstanceArgs(bootstrapParams, extraSpecs) if err != nil { - return params.Instance{}, errors.Wrap(err, "fetching create args") + return commonParams.ProviderInstance{}, errors.Wrap(err, "fetching create args") } if err := l.launchInstance(args); err != nil { - return params.Instance{}, errors.Wrap(err, "creating instance") + return commonParams.ProviderInstance{}, errors.Wrap(err, "creating instance") } ret, err := l.waitInstanceHasIP(ctx, args.Name) if err != nil { - return params.Instance{}, errors.Wrap(err, "fetching instance") + return commonParams.ProviderInstance{}, errors.Wrap(err, "fetching instance") } return ret, nil } // GetInstance will return details about one instance. -func (l *LXD) GetInstance(ctx context.Context, instanceName string) (params.Instance, error) { +func (l *LXD) GetInstance(ctx context.Context, instanceName string) (commonParams.ProviderInstance, error) { cli, err := l.getCLI() if err != nil { - return params.Instance{}, errors.Wrap(err, "fetching client") + return commonParams.ProviderInstance{}, errors.Wrap(err, "fetching client") } instance, _, err := cli.GetInstanceFull(instanceName) if err != nil { if isNotFoundError(err) { - return params.Instance{}, errors.Wrapf(runnerErrors.ErrNotFound, "fetching instance: %q", err) + return commonParams.ProviderInstance{}, errors.Wrapf(runnerErrors.ErrNotFound, "fetching instance: %q", err) } - return params.Instance{}, errors.Wrap(err, "fetching instance") + return commonParams.ProviderInstance{}, errors.Wrap(err, "fetching instance") } return lxdInstanceToAPIInstance(instance), nil @@ -420,10 +420,10 @@ type listResponse struct { } // ListInstances will list all instances for a provider. -func (l *LXD) ListInstances(ctx context.Context, poolID string) ([]params.Instance, error) { +func (l *LXD) ListInstances(ctx context.Context, poolID string) ([]commonParams.ProviderInstance, error) { cli, err := l.getCLI() if err != nil { - return []params.Instance{}, errors.Wrap(err, "fetching client") + return []commonParams.ProviderInstance{}, errors.Wrap(err, "fetching client") } result := make(chan listResponse, 1) @@ -445,14 +445,14 @@ func (l *LXD) ListInstances(ctx context.Context, poolID string) ([]params.Instan select { case res := <-result: if res.err != nil { - return []params.Instance{}, errors.Wrap(res.err, "fetching instances") + return []commonParams.ProviderInstance{}, errors.Wrap(res.err, "fetching instances") } instances = res.instances case <-time.After(time.Second * 60): - return []params.Instance{}, errors.Wrap(runnerErrors.ErrTimeout, "fetching instances from provider") + return []commonParams.ProviderInstance{}, errors.Wrap(runnerErrors.ErrTimeout, "fetching instances from provider") } - ret := []params.Instance{} + ret := []commonParams.ProviderInstance{} for _, instance := range instances { if id, ok := instance.ExpandedConfig[controllerIDKeyName]; ok && id == l.controllerID { diff --git a/runner/providers/lxd/util.go b/runner/providers/lxd/util.go index aa70c8f2..2168bcec 100644 --- a/runner/providers/lxd/util.go +++ b/runner/providers/lxd/util.go @@ -29,7 +29,6 @@ import ( "github.com/cloudbase/garm-provider-common/util" "github.com/cloudbase/garm/config" - "github.com/cloudbase/garm/params" "github.com/juju/clock" "github.com/juju/retry" @@ -62,7 +61,7 @@ func isNotFoundError(err error) bool { return false } -func lxdInstanceToAPIInstance(instance *api.InstanceFull) params.Instance { +func lxdInstanceToAPIInstance(instance *api.InstanceFull) commonParams.ProviderInstance { lxdOS, ok := instance.ExpandedConfig["image.os"] if !ok { log.Printf("failed to find OS in instance config") @@ -107,7 +106,7 @@ func lxdInstanceToAPIInstance(instance *api.InstanceFull) params.Instance { log.Printf("failed to find OS architecture") } - return params.Instance{ + return commonParams.ProviderInstance{ OSArch: instanceArch, ProviderID: instance.Name, Name: instance.Name, @@ -200,8 +199,8 @@ func resolveArchitecture(osArch commonParams.OSArch) (string, error) { // waitDeviceActive is a function capable of figuring out when a Equinix Metal // device is active -func (l *LXD) waitInstanceHasIP(ctx context.Context, instanceName string) (params.Instance, error) { - var p params.Instance +func (l *LXD) waitInstanceHasIP(ctx context.Context, instanceName string) (commonParams.ProviderInstance, error) { + var p commonParams.ProviderInstance var errIPNotFound error = fmt.Errorf("ip not found") err := retry.Call(retry.CallArgs{ Func: func() error { @@ -228,7 +227,7 @@ func (l *LXD) waitInstanceHasIP(ctx context.Context, instanceName string) (param }) if err != nil && err != errIPNotFound { - return params.Instance{}, err + return commonParams.ProviderInstance{}, err } return p, nil diff --git a/vendor/github.com/cloudbase/garm-provider-common/params/params.go b/vendor/github.com/cloudbase/garm-provider-common/params/params.go index 1727e444..eb2ce50f 100644 --- a/vendor/github.com/cloudbase/garm-provider-common/params/params.go +++ b/vendor/github.com/cloudbase/garm-provider-common/params/params.go @@ -141,4 +141,8 @@ type ProviderInstance struct { // Status is the status of the instance inside the provider (eg: running, stopped, etc) Status InstanceStatus `json:"status,omitempty"` + + // ProviderFault holds any error messages captured from the IaaS provider that is + // responsible for managing the lifecycle of the runner. + ProviderFault []byte `json:"provider_fault,omitempty"` } diff --git a/vendor/github.com/cloudbase/garm-provider-common/util/exec/exec.go b/vendor/github.com/cloudbase/garm-provider-common/util/exec/exec.go new file mode 100644 index 00000000..654b0955 --- /dev/null +++ b/vendor/github.com/cloudbase/garm-provider-common/util/exec/exec.go @@ -0,0 +1,25 @@ +package exec + +import ( + "bytes" + "context" + "os/exec" + + "github.com/pkg/errors" +) + +func Exec(ctx context.Context, providerBin string, stdinData []byte, environ []string) ([]byte, error) { + stdout := &bytes.Buffer{} + stderr := &bytes.Buffer{} + c := exec.CommandContext(ctx, providerBin) + c.Env = environ + c.Stdin = bytes.NewBuffer(stdinData) + c.Stdout = stdout + c.Stderr = stderr + + if err := c.Run(); err != nil { + return nil, errors.Wrapf(err, "provider binary failed with stdout: %s; stderr: %s", stdout.String(), stderr.String()) + } + + return stdout.Bytes(), nil +} diff --git a/vendor/github.com/cloudbase/garm-provider-common/util/exec/exec_nix.go b/vendor/github.com/cloudbase/garm-provider-common/util/exec/exec_nix.go new file mode 100644 index 00000000..1525eca6 --- /dev/null +++ b/vendor/github.com/cloudbase/garm-provider-common/util/exec/exec_nix.go @@ -0,0 +1,12 @@ +//go:build !windows +// +build !windows + +package exec + +import ( + "golang.org/x/sys/unix" +) + +func IsExecutable(path string) bool { + return unix.Access(path, unix.X_OK) == nil +} diff --git a/vendor/github.com/cloudbase/garm-provider-common/util/exec/exec_windows.go b/vendor/github.com/cloudbase/garm-provider-common/util/exec/exec_windows.go new file mode 100644 index 00000000..0c17839c --- /dev/null +++ b/vendor/github.com/cloudbase/garm-provider-common/util/exec/exec_windows.go @@ -0,0 +1,18 @@ +package exec + +import ( + "os" + "strings" +) + +func IsExecutable(path string) bool { + pathExt := os.Getenv("PATHEXT") + execList := strings.Split(pathExt, ";") + for _, ext := range execList { + if strings.HasSuffix(path, ext) { + return true + } + } + + return false +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 6a4b27ee..ad7f9dc6 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -34,7 +34,7 @@ github.com/cespare/xxhash/v2 # github.com/chzyer/readline v1.5.1 ## explicit; go 1.15 github.com/chzyer/readline -# github.com/cloudbase/garm-provider-common v0.0.0-20230722221640-5f53e8404727 +# github.com/cloudbase/garm-provider-common v0.0.0-20230723124240-9ad9282807e5 ## explicit; go 1.20 github.com/cloudbase/garm-provider-common/cloudconfig github.com/cloudbase/garm-provider-common/defaults