Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: allow custom engine, core, files images #2454

Open
wants to merge 11 commits into
base: main
Choose a base branch
from
20 changes: 19 additions & 1 deletion cli/cli/commands/engine/restart/restart.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,13 @@ import (

const (
engineVersionFlagKey = "version"
engineAuthorFlagKey = "author"
logLevelFlagKey = "log-level"
enclavePoolSizeFlagKey = "enclave-pool-size"
githubAuthTokenOverrideFlagKey = "github-auth-token"

defaultEngineVersion = ""
defaultEngineAuthor = "kurtosistech"
restartEngineOnSameVersionIfAnyRunning = false

defaultShouldRestartAPIContainers = "false"
Expand All @@ -44,6 +46,13 @@ var RestartCmd = &lowlevel.LowlevelKurtosisCommand{
Type: flags.FlagType_String,
Default: defaultEngineVersion,
},
{
Key: engineAuthorFlagKey,
Usage: "The author (Docker username) of the Kurtosis engine that should be started (blank will start the kurtosistech version)",
Shorthand: "",
Type: flags.FlagType_String,
Default: defaultEngineAuthor,
},
{
Key: logLevelFlagKey,
Usage: fmt.Sprintf(
Expand Down Expand Up @@ -142,9 +151,18 @@ func run(_ context.Context, flags *flags.ParsedFlags, _ *args.ParsedArgs) error
return stacktrace.Propagate(err, "Expected a value for the '%v' flag but failed to get it", restartAPIContainersFlagKey)
}

engineAuthor, err := flags.GetString(engineAuthorFlagKey)
if err != nil {
return stacktrace.Propagate(err, "Expected a value for the '%v' flag but failed to get it", engineAuthorFlagKey)
}

if engineAuthor != defaultEngineAuthor && engineVersion == defaultEngineVersion {
return stacktrace.NewError("Expected '%v' to be set as '%v' was set. Need to enter a custom engine veresion if a custom engine author is set", engineVersionFlagKey, engineAuthorFlagKey)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
return stacktrace.NewError("Expected '%v' to be set as '%v' was set. Need to enter a custom engine veresion if a custom engine author is set", engineVersionFlagKey, engineAuthorFlagKey)
return stacktrace.NewError("Expected '%v' to be set as '%v' was set. Need to enter a custom engine version if a custom engine author is set", engineVersionFlagKey, engineAuthorFlagKey)

}

var engineClientCloseFunc func() error
var restartEngineErr error
_, engineClientCloseFunc, restartEngineErr = engineManager.RestartEngineIdempotently(ctx, logLevel, engineVersion, restartEngineOnSameVersionIfAnyRunning, enclavePoolSize, shouldStartInDebugMode, githubAuthTokenOverride, shouldRestartAPIContainers)
_, engineClientCloseFunc, restartEngineErr = engineManager.RestartEngineIdempotently(ctx, logLevel, engineVersion, engineAuthor, restartEngineOnSameVersionIfAnyRunning, enclavePoolSize, shouldStartInDebugMode, githubAuthTokenOverride, shouldRestartAPIContainers)
if restartEngineErr != nil {
return stacktrace.Propagate(restartEngineErr, "An error occurred restarting the Kurtosis engine")
}
Expand Down
33 changes: 28 additions & 5 deletions cli/cli/commands/engine/start/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,13 @@ import (

const (
engineVersionFlagKey = "version"
engineAuthorFlagKey = "author"
logLevelFlagKey = "log-level"
enclavePoolSizeFlagKey = "enclave-pool-size"
githubAuthTokenOverrideFlagKey = "github-auth-token"

defaultEngineVersion = ""
defaultEngineAuthor = "kurtosistech"
kurtosisTechEngineImagePrefix = "kurtosistech/engine"
imageVersionDelimiter = ":"

Expand All @@ -45,6 +47,13 @@ var StartCmd = &lowlevel.LowlevelKurtosisCommand{
Type: flags.FlagType_String,
Default: defaultEngineVersion,
},
{
Key: engineAuthorFlagKey,
Usage: "The author (Docker username) of the Kurtosis engine that should be started (blank will start the kurtosistech version)",
Shorthand: "",
Type: flags.FlagType_String,
Default: defaultEngineAuthor,
},
{
Key: logLevelFlagKey,
Usage: fmt.Sprintf(
Expand Down Expand Up @@ -138,16 +147,30 @@ func run(_ context.Context, flags *flags.ParsedFlags, _ *args.ParsedArgs) error
return stacktrace.Propagate(err, "Expected a value for the '%v' flag but failed to get it", restartAPIContainersFlagKey)
}

engineAuthor, err := flags.GetString(engineAuthorFlagKey)
if err != nil {
return stacktrace.Propagate(err, "Expected a value for the '%v' flag but failed to get it", engineAuthorFlagKey)
}

if engineAuthor != defaultEngineAuthor && engineVersion == defaultEngineVersion {
return stacktrace.NewError("Expected '%v' to be set as '%v' was set. Need to enter a custom engine veresion if a custom engine author is set", engineVersionFlagKey, engineAuthorFlagKey)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
return stacktrace.NewError("Expected '%v' to be set as '%v' was set. Need to enter a custom engine veresion if a custom engine author is set", engineVersionFlagKey, engineAuthorFlagKey)
return stacktrace.NewError("Expected '%v' to be set as '%v' was set. Need to enter a custom engine version if a custom engine author is set", engineVersionFlagKey, engineAuthorFlagKey)

}

imageForLogging := kurtosisTechEngineImagePrefix
if engineAuthor != defaultEngineAuthor {
imageForLogging = strings.Replace(imageForLogging, defaultEngineAuthor, engineAuthor, 1)
}

if engineVersion == defaultEngineVersion && isDebugMode {
engineDebugVersion := fmt.Sprintf("%s-%s", kurtosis_version.KurtosisVersion, defaults.DefaultKurtosisContainerDebugImageNameSuffix)
logrus.Infof("Starting Kurtosis engine in debug mode from image '%v%v%v'...", kurtosisTechEngineImagePrefix, imageVersionDelimiter, engineDebugVersion)
_, engineClientCloseFunc, startEngineErr = engineManager.StartEngineIdempotentlyWithCustomVersion(ctx, engineDebugVersion, logLevel, enclavePoolSize, true, githubAuthTokenOverride, shouldRestartAPIContainers)
logrus.Infof("Starting Kurtosis engine in debug mode from image '%v%v%v'...", imageForLogging, imageVersionDelimiter, engineDebugVersion)
_, engineClientCloseFunc, startEngineErr = engineManager.StartEngineIdempotentlyWithCustomVersion(ctx, engineDebugVersion, engineAuthor, logLevel, enclavePoolSize, true, githubAuthTokenOverride, shouldRestartAPIContainers)
} else if engineVersion == defaultEngineVersion {
logrus.Infof("Starting Kurtosis engine from image '%v%v%v'...", kurtosisTechEngineImagePrefix, imageVersionDelimiter, kurtosis_version.KurtosisVersion)
logrus.Infof("Starting Kurtosis engine from image '%v%v%v'...", imageForLogging, imageVersionDelimiter, kurtosis_version.KurtosisVersion)
_, engineClientCloseFunc, startEngineErr = engineManager.StartEngineIdempotentlyWithDefaultVersion(ctx, logLevel, enclavePoolSize, githubAuthTokenOverride, shouldRestartAPIContainers)
} else {
logrus.Infof("Starting Kurtosis engine from image '%v%v%v'...", kurtosisTechEngineImagePrefix, imageVersionDelimiter, engineVersion)
_, engineClientCloseFunc, startEngineErr = engineManager.StartEngineIdempotentlyWithCustomVersion(ctx, engineVersion, logLevel, enclavePoolSize, defaults.DefaultEnableDebugMode, githubAuthTokenOverride, shouldRestartAPIContainers)
logrus.Infof("Starting Kurtosis engine from image '%v%v%v'...", imageForLogging, imageVersionDelimiter, engineVersion)
_, engineClientCloseFunc, startEngineErr = engineManager.StartEngineIdempotentlyWithCustomVersion(ctx, engineVersion, engineAuthor, logLevel, enclavePoolSize, defaults.DefaultEnableDebugMode, githubAuthTokenOverride, shouldRestartAPIContainers)
}
if startEngineErr != nil {
return stacktrace.Propagate(startEngineErr, "An error occurred starting the Kurtosis engine")
Expand Down
3 changes: 2 additions & 1 deletion cli/cli/commands/github/login/login.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (

const (
defaultEngineVersion = ""
defaultEngineAuthor = "kurtosistech"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we move this to this package: cli/cli/defaults/defaults.go ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

now I wonder if this value shouldn't be in the launcher and an empty string makes the launcher use the default value. WDYT?

restartEngineOnSameVersionIfAnyRunning = true
)

Expand Down Expand Up @@ -71,7 +72,7 @@ func RestartEngineAfterGitHubAuth(ctx context.Context) error {
var engineClientCloseFunc func() error
var restartEngineErr error
dontRestartAPIContainers := false
_, engineClientCloseFunc, restartEngineErr = engineManager.RestartEngineIdempotently(ctx, defaults.DefaultEngineLogLevel, defaultEngineVersion, restartEngineOnSameVersionIfAnyRunning, defaults.DefaultEngineEnclavePoolSize, defaults.DefaultEnableDebugMode, defaults.DefaultGitHubAuthTokenOverride, dontRestartAPIContainers)
_, engineClientCloseFunc, restartEngineErr = engineManager.RestartEngineIdempotently(ctx, defaults.DefaultEngineLogLevel, defaultEngineVersion, defaultEngineAuthor, restartEngineOnSameVersionIfAnyRunning, defaults.DefaultEngineEnclavePoolSize, defaults.DefaultEnableDebugMode, defaults.DefaultGitHubAuthTokenOverride, dontRestartAPIContainers)
if restartEngineErr != nil {
return stacktrace.Propagate(restartEngineErr, "An error occurred restarting the Kurtosis engine")
}
Expand Down
10 changes: 9 additions & 1 deletion cli/cli/helpers/engine_manager/engine_existence_guarantor.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
const (
// If set to empty, then we'll use whichever default version the launcher provides
defaultEngineImageVersionTag = ""
defaultEngineAuthor = "kurtosistech"
shouldForceLogsComponentsContainersRestartWhenEngineContainerIsStopped = true
shouldForceLogsComponentsContainersRestartWhenEngineContainerIsRunning = false
)
Expand Down Expand Up @@ -84,6 +85,9 @@ type engineExistenceGuarantor struct {

// To restart the current API containers after the engine has been restarted
restartAPIContainers bool

// The author of the repository where the engine is
engineAuthor string
}

func newEngineExistenceGuarantorWithDefaultVersion(
Expand All @@ -110,6 +114,7 @@ func newEngineExistenceGuarantorWithDefaultVersion(
shouldSendMetrics,
engineServerKurtosisBackendConfigSupplier,
defaultEngineImageVersionTag,
defaultEngineAuthor,
logLevel,
maybeCurrentlyRunningEngineVersionTag,
kurtosisClusterType,
Expand All @@ -130,6 +135,7 @@ func newEngineExistenceGuarantorWithCustomVersion(
shouldSendMetrics bool,
engineServerKurtosisBackendConfigSupplier engine_server_launcher.KurtosisBackendConfigSupplier,
imageVersionTag string,
engineAuthor string,
logLevel logrus.Level,
maybeCurrentlyRunningEngineVersionTag string,
kurtosisClusterType resolved_config.KurtosisClusterType,
Expand Down Expand Up @@ -160,6 +166,7 @@ func newEngineExistenceGuarantorWithCustomVersion(
shouldRunInDebugMode: shouldRunInDebugMode,
githubAuthTokenOverride: githubAuthTokenOverride,
restartAPIContainers: restartAPIContainers,
engineAuthor: engineAuthor,
}
}

Expand Down Expand Up @@ -221,9 +228,10 @@ func (guarantor *engineExistenceGuarantor) VisitStopped() error {
guarantor.restartAPIContainers,
)
} else {
_, _, engineLaunchErr = guarantor.engineServerLauncher.LaunchWithCustomVersion(
_, _, engineLaunchErr = guarantor.engineServerLauncher.LaunchWithCustomImageAuthor(
guarantor.ctx,
guarantor.imageVersionTag,
guarantor.engineAuthor,
guarantor.logLevel,
kurtosis_context.DefaultGrpcEngineServerPortNum,
metricsUserId,
Expand Down
5 changes: 4 additions & 1 deletion cli/cli/helpers/engine_manager/engine_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@ func (manager *EngineManager) StartEngineIdempotentlyWithDefaultVersion(
func (manager *EngineManager) StartEngineIdempotentlyWithCustomVersion(
ctx context.Context,
engineImageVersionTag string,
engineAuthor string,
logLevel logrus.Level,
poolSize uint8,
shouldStartInDebugMode bool,
Expand All @@ -238,6 +239,7 @@ func (manager *EngineManager) StartEngineIdempotentlyWithCustomVersion(
manager.shouldSendMetrics,
manager.engineServerKurtosisBackendConfigSupplier,
engineImageVersionTag,
engineAuthor,
logLevel,
engineVersion,
clusterType,
Expand Down Expand Up @@ -343,6 +345,7 @@ func (manager *EngineManager) RestartEngineIdempotently(
ctx context.Context,
logLevel logrus.Level,
optionalVersionToUse string,
engineAuthor string,
restartEngineOnSameVersionIfAnyRunning bool,
poolSize uint8,
shouldStartInDebugMode bool,
Expand Down Expand Up @@ -373,7 +376,7 @@ func (manager *EngineManager) RestartEngineIdempotently(
var engineClientCloseFunc func() error
var restartEngineErr error
if versionOfNewEngine != defaultEngineVersion {
_, engineClientCloseFunc, restartEngineErr = manager.StartEngineIdempotentlyWithCustomVersion(ctx, versionOfNewEngine, logLevel, poolSize, shouldStartInDebugMode, githubAuthTokenOverride, shouldRestartAPIContainers)
_, engineClientCloseFunc, restartEngineErr = manager.StartEngineIdempotentlyWithCustomVersion(ctx, versionOfNewEngine, engineAuthor, logLevel, poolSize, shouldStartInDebugMode, githubAuthTokenOverride, shouldRestartAPIContainers)
} else {
_, engineClientCloseFunc, restartEngineErr = manager.StartEngineIdempotentlyWithDefaultVersion(ctx, logLevel, poolSize, githubAuthTokenOverride, shouldRestartAPIContainers)
}
Expand Down
46 changes: 44 additions & 2 deletions core/launcher/api_container_launcher/api_container_launcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ const (
enclaveDataVolumeDirpath = "/kurtosis-data"

// TODO This should come from the same logic that builds the server image!!!!!
containerImage = "kurtosistech/core"
defaultImageAuthor = "kurtosistech"
authorImageNameSeparator = "/"
containerImage = "core"
)

type ApiContainerLauncher struct {
Expand Down Expand Up @@ -90,6 +92,45 @@ func (launcher ApiContainerLauncher) LaunchWithCustomVersion(
) (
resultApiContainer *api_container.APIContainer,
resultErr error,
) {
return launcher.LaunchWithCustomImageAuthor(
ctx,
imageVersionTag,
defaultImageAuthor,
logLevel,
enclaveUuid,
grpcPortNum,
backendConfigSupplier,
enclaveEnvVars,
isProductionEnclave,
metricsUserID,
didUserAcceptSendingMetrics,
isCI,
cloudUserID,
cloudInstanceID,
shouldStartInDebugMode,
)
}

func (launcher ApiContainerLauncher) LaunchWithCustomImageAuthor(
ctx context.Context,
imageVersionTag string,
imageAuthor string,
logLevel logrus.Level,
enclaveUuid enclave.EnclaveUUID,
grpcPortNum uint16,
backendConfigSupplier KurtosisBackendConfigSupplier,
enclaveEnvVars string,
isProductionEnclave bool,
metricsUserID string,
didUserAcceptSendingMetrics bool,
isCI bool,
cloudUserID metrics_client.CloudUserID,
cloudInstanceID metrics_client.CloudInstanceID,
shouldStartInDebugMode bool,
) (
resultApiContainer *api_container.APIContainer,
resultErr error,
) {
kurtosisBackendType, kurtosisBackendConfig := backendConfigSupplier.getKurtosisBackendConfig()
argsObj, err := args.NewAPIContainerArgs(
Expand All @@ -107,6 +148,7 @@ func (launcher ApiContainerLauncher) LaunchWithCustomVersion(
isCI,
cloudUserID,
cloudInstanceID,
imageAuthor,
)
if err != nil {
return nil, stacktrace.Propagate(err, "An error occurred creating the API container args")
Expand All @@ -119,7 +161,7 @@ func (launcher ApiContainerLauncher) LaunchWithCustomVersion(

containerImageAndTag := fmt.Sprintf(
"%v:%v",
containerImage,
imageAuthor+authorImageNameSeparator+containerImage,
imageVersionTag,
)

Expand Down
6 changes: 6 additions & 0 deletions core/launcher/args/api_container_args.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ type APIContainerArgs struct {

// The Cloud Instance ID of the current user if available
CloudInstanceID metrics_client.CloudInstanceID `json:"cloud_instance_id"`

// The author of the image for the APIC, Engine and Files Artifact Expander
// In case someone is using a non Kurtosis published image
ImageAuthor string `json:"image_author"`
}

var skipValidation = map[string]bool{
Expand Down Expand Up @@ -110,6 +114,7 @@ func NewAPIContainerArgs(
isCI bool,
cloudUserID metrics_client.CloudUserID,
cloudInstanceID metrics_client.CloudInstanceID,
imageAuthor string,
) (*APIContainerArgs, error) {
result := &APIContainerArgs{
Version: version,
Expand All @@ -126,6 +131,7 @@ func NewAPIContainerArgs(
IsCI: isCI,
CloudUserID: cloudUserID,
CloudInstanceID: cloudInstanceID,
ImageAuthor: imageAuthor,
}

if err := result.validate(); err != nil {
Expand Down
1 change: 1 addition & 0 deletions core/server/api_container/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,7 @@ func createServiceNetwork(
ownIpAddress,
args.GrpcListenPortNum,
args.Version,
args.ImageAuthor,
)

serviceNetwork, err := service_network.NewDefaultServiceNetwork(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,21 @@ type ApiContainerInfo struct {
grpcPortNum uint16

version string

imageAuthor string
}

func NewApiContainerInfo(
ipAddress net.IP,
grpcPortNum uint16,
version string,
imageAuthor string,
) *ApiContainerInfo {
return &ApiContainerInfo{
ipAddress: ipAddress,
grpcPortNum: grpcPortNum,
version: version,
imageAuthor: imageAuthor,
}
}

Expand All @@ -33,3 +37,7 @@ func (apic *ApiContainerInfo) GetGrpcPortNum() uint16 {
func (apic *ApiContainerInfo) GetVersion() string {
return apic.version
}

func (apic *ApiContainerInfo) GetImageAuthor() string {
return apic.imageAuthor
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ var (
testIpFromInt(0),
uint16(1234),
"0.0.0",
"kurtosistech",
)
unusedEnclaveDataDir *enclave_data_directory.EnclaveDataDirectory

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ type serviceConfigFullTestCaseBackwardCompatible struct {

func (suite *KurtosisTypeConstructorTestSuite) TestServiceConfigFullBackwardCompatible() {
suite.serviceNetwork.EXPECT().GetApiContainerInfo().Times(1).Return(
service_network.NewApiContainerInfo(net.IPv4(0, 0, 0, 0), 0, "0.0.0"),
service_network.NewApiContainerInfo(net.IPv4(0, 0, 0, 0), 0, "0.0.0", testImageAuthor),
)

suite.run(&serviceConfigFullTestCaseBackwardCompatible{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ type serviceConfigFullTestCase struct {

func (suite *KurtosisTypeConstructorTestSuite) TestServiceConfigFull() {
suite.serviceNetwork.EXPECT().GetApiContainerInfo().Times(1).Return(
service_network.NewApiContainerInfo(net.IPv4(0, 0, 0, 0), 0, "0.0.0"),
service_network.NewApiContainerInfo(net.IPv4(0, 0, 0, 0), 0, "0.0.0", testImageAuthor),
)

suite.run(&serviceConfigFullTestCase{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ type serviceConfigMultipleFilesInSameFolderTestCase struct {
func (suite *KurtosisTypeConstructorTestSuite) TestServiceConfigMultipleFilesInSameFolder() {

suite.serviceNetwork.EXPECT().GetApiContainerInfo().Times(1).Return(
service_network.NewApiContainerInfo(net.IPv4(0, 0, 0, 0), 0, "0.0.0"),
service_network.NewApiContainerInfo(net.IPv4(0, 0, 0, 0), 0, "0.0.0", testImageAuthor),
)

suite.run(&serviceConfigMultipleFilesInSameFolderTestCase{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,4 +151,6 @@ var (
testTolerationSeconds = int64(64)

testFilesToBeMoved = "test.txt"

testImageAuthor = "kurtosistech"
)
Loading
Loading