diff --git a/app/drivers/imanager.go b/app/drivers/imanager.go index fc2c3d31..323cd28d 100644 --- a/app/drivers/imanager.go +++ b/app/drivers/imanager.go @@ -17,7 +17,7 @@ type IManager interface { Update(ctx context.Context, instance *types.Instance) error Add(pools ...Pool) error StartInstancePurger(ctx context.Context, maxAgeBusy, maxAgeFree time.Duration, purgerTime time.Duration) error - Provision(ctx context.Context, poolName, serverName, ownerID, resourceClass string, query *types.QueryParams, gitspaceAgentConfig *types.GitspaceAgentConfig, storageConfig *types.StorageConfig, zone string) (*types.Instance, error) //nolint + Provision(ctx context.Context, poolName, serverName, ownerID, resourceClass string, imageName string, query *types.QueryParams, gitspaceAgentConfig *types.GitspaceAgentConfig, storageConfig *types.StorageConfig, zone string) (*types.Instance, error) //nolint Destroy(ctx context.Context, poolName string, instanceID string, instance *types.Instance, storageCleanupType *storage.CleanupType) error BuildPools(ctx context.Context) error CleanPools(ctx context.Context, destroyBusy, destroyFree bool) error diff --git a/app/drivers/manager.go b/app/drivers/manager.go index 3faf2213..fee813fd 100644 --- a/app/drivers/manager.go +++ b/app/drivers/manager.go @@ -321,6 +321,7 @@ func (m *Manager) Provision( serverName, ownerID, resourceClass string, + imageName string, query *types.QueryParams, gitspaceAgentConfig *types.GitspaceAgentConfig, storageConfig *types.StorageConfig, @@ -336,7 +337,7 @@ func (m *Manager) Provision( if pool.Driver.DriverName() != string(types.Nomad) && pool.Driver.DriverName() != string(types.Google) { return nil, fmt.Errorf("incorrect pool, gitspaces is only supported on nomad/google") } - inst, err := m.setupInstance(ctx, pool, serverName, ownerID, resourceClass, true, gitspaceAgentConfig, storageConfig, zone) + inst, err := m.setupInstance(ctx, pool, serverName, ownerID, resourceClass, imageName, true, gitspaceAgentConfig, storageConfig, zone) return inst, err } @@ -359,7 +360,7 @@ func (m *Manager) Provision( return nil, ErrorNoInstanceAvailable } var inst *types.Instance - inst, err = m.setupInstance(ctx, pool, serverName, ownerID, resourceClass, true, gitspaceAgentConfig, storageConfig, zone) + inst, err = m.setupInstance(ctx, pool, serverName, ownerID, resourceClass, imageName, true, gitspaceAgentConfig, storageConfig, zone) if err != nil { return nil, fmt.Errorf("provision: failed to create instance: %w", err) } @@ -390,7 +391,7 @@ func (m *Manager) Provision( // the go routine here uses the global context because this function is called // from setup API call (and we can't use HTTP request context for async tasks) go func(ctx context.Context) { - _, _ = m.setupInstance(ctx, pool, serverName, "", "", false, nil, nil, zone) + _, _ = m.setupInstance(ctx, pool, serverName, "", "", "", false, nil, nil, zone) }(m.globalCtx) return inst, nil @@ -554,7 +555,7 @@ func (m *Manager) buildPool(ctx context.Context, pool *poolEntry, tlsServerName defer wg.Done() // generate certs cert - inst, err := m.setupInstance(ctx, pool, tlsServerName, "", "", false, nil, nil, "") + inst, err := m.setupInstance(ctx, pool, tlsServerName, "", "", "", false, nil, nil, "") if err != nil { logr.WithError(err).Errorln("build pool: failed to create instance") return @@ -586,6 +587,7 @@ func (m *Manager) setupInstance( tlsServerName, ownerID, resourceClass string, + imageName string, inuse bool, agentConfig *types.GitspaceAgentConfig, storageConfig *types.StorageConfig, @@ -607,6 +609,7 @@ func (m *Manager) setupInstance( createOptions.Tmate = m.tmate createOptions.AccountID = ownerID createOptions.ResourceClass = resourceClass + createOptions.ImageName = imageName if storageConfig != nil { createOptions.StorageOpts = types.StorageOpts{ CephPoolIdentifier: storageConfig.CephPoolIdentifier, diff --git a/app/drivers/nomad/driver.go b/app/drivers/nomad/driver.go index 909e8748..fa81dd23 100644 --- a/app/drivers/nomad/driver.go +++ b/app/drivers/nomad/driver.go @@ -174,6 +174,11 @@ func (p *config) Create(ctx context.Context, opts *types.InstanceCreateOpts) (*t class = p.virtualizer.GetGlobalAccountID() } + image := opts.ImageName + if image == "" { + image = p.vmImage + } + // Create a resource job which occupies resources until the VM is alive to avoid // oversubscribing the node var resourceJob *api.Job @@ -231,7 +236,7 @@ func (p *config) Create(ctx context.Context, opts *types.InstanceCreateOpts) (*t if p.noop { initJob, initJobID, initTaskGroup = p.initJobNoop(vm, id, liteEngineHostPort) } else { - initJob, initJobID, initTaskGroup, err = p.virtualizer.GetInitJob(vm, id, p.vmImage, p.userData, p.username, p.password, liteEngineHostPort, resource, opts, gitspacesPortMappings) + initJob, initJobID, initTaskGroup, err = p.virtualizer.GetInitJob(vm, id, image, p.userData, p.username, p.password, liteEngineHostPort, resource, opts, gitspacesPortMappings) if err != nil { defer p.deregisterJob(logr, resourceJobID, false) //nolint:errcheck return nil, err diff --git a/command/harness/setup.go b/command/harness/setup.go index c6c456cb..a94e29df 100644 --- a/command/harness/setup.go +++ b/command/harness/setup.go @@ -33,6 +33,7 @@ type SetupVMRequest struct { LogKey string `json:"log_key"` Context Context `json:"context,omitempty"` ResourceClass string `json:"resource_class"` + ImageName string `json:"image_name"` api.SetupRequest `json:"setup_request"` GitspaceAgentConfig types.GitspaceAgentConfig `json:"gitspace_agent_config"` StorageConfig types.StorageConfig `json:"storage_config"` @@ -243,7 +244,7 @@ func handleSetup( RunnerName: runnerName, } } - instance, err := poolManager.Provision(ctx, pool, poolManager.GetTLSServerName(), owner, r.ResourceClass, query, &r.GitspaceAgentConfig, &r.StorageConfig, r.Zone) + instance, err := poolManager.Provision(ctx, pool, poolManager.GetTLSServerName(), owner, r.ResourceClass, r.ImageName, query, &r.GitspaceAgentConfig, &r.StorageConfig, r.Zone) if err != nil { return nil, fmt.Errorf("failed to provision instance: %w", err) } diff --git a/command/setup/setup.go b/command/setup/setup.go index bce33a71..7b65ffd5 100644 --- a/command/setup/setup.go +++ b/command/setup/setup.go @@ -155,7 +155,7 @@ func (c *setupCommand) run(*kingpin.ParseContext) error { //nolint Fatalln("setup: unable to add pool") } // provision - instance, provisionErr := poolManager.Provision(ctx, testPoolName, runnerName, "drone", "", nil, nil, nil, "") + instance, provisionErr := poolManager.Provision(ctx, testPoolName, runnerName, "drone", "", "", nil, nil, nil, "") if provisionErr != nil { consoleLogs, consoleErr := poolManager.InstanceLogs(ctx, testPoolName, instance.ID) logrus.Infof("setup: instance logs for %s: %s", instance.ID, consoleLogs) diff --git a/engine/engine.go b/engine/engine.go index 1fa2635b..f3824e92 100644 --- a/engine/engine.go +++ b/engine/engine.go @@ -66,7 +66,7 @@ func (e *Engine) Setup(ctx context.Context, specv runtime.Spec) error { } // lets see if there is anything in the pool - instance, err := manager.Provision(ctx, poolName, e.config.Runner.Name, "drone", "", nil, nil, nil, "") + instance, err := manager.Provision(ctx, poolName, e.config.Runner.Name, "drone", "", "", nil, nil, nil, "") if err != nil { logr.WithError(err).Errorln("failed to provision an instance") return err diff --git a/types/types.go b/types/types.go index c432d11f..8b6688a3 100644 --- a/types/types.go +++ b/types/types.go @@ -103,6 +103,7 @@ type InstanceCreateOpts struct { AccountID string IsHosted bool ResourceClass string + ImageName string GitspaceOpts GitspaceOpts StorageOpts StorageOpts AutoInjectionBinaryURI string