diff --git a/cmd/agentbasedinstaller/client/main.go b/cmd/agentbasedinstaller/client/main.go index ce9b946ac01..14ee91558b6 100644 --- a/cmd/agentbasedinstaller/client/main.go +++ b/cmd/agentbasedinstaller/client/main.go @@ -91,8 +91,15 @@ func main() { } switch os.Args[1] { case "register": + // registers both cluster and infraenv infraEnvID := register(ctx, log, bmInventory) os.WriteFile("/etc/assisted/client_config", []byte("INFRA_ENV_ID="+infraEnvID), 0644) + case "registerCluster": + clusterID := registerCluster(ctx, log, bmInventory) + os.WriteFile("/etc/assisted/client_config", []byte("CLUSTER_ID="+clusterID), 0644) + case "registerInfraEnv": + infraEnvID := registerInfraEnv(ctx, log, bmInventory) + os.WriteFile("/etc/assisted/client_config", []byte("INFRA_ENV_ID="+infraEnvID), 0644) case "configure": configure(ctx, log, bmInventory) default: @@ -130,6 +137,70 @@ func register(ctx context.Context, log *log.Logger, bmInventory *client.Assisted return modelsInfraEnv.ID.String() } +func registerCluster(ctx context.Context, log *log.Logger, bmInventory *client.AssistedInstall) string { + err := envconfig.Process("", &RegisterOptions) + if err != nil { + log.Fatal(err.Error()) + } + + existingCluster, err := agentbasedinstaller.GetCluster(ctx, log, bmInventory) + if err == nil { + log.Infof("Skipping cluster registration. Found existing cluster with id: %s", existingCluster.ID.String()) + return existingCluster.ID.String() + } + + pullSecret, err := agentbasedinstaller.GetPullSecret(RegisterOptions.PullSecretFile) + if err != nil { + log.Fatal("Failed to get pull secret: ", err.Error()) + } + + modelsCluster, err := agentbasedinstaller.RegisterCluster(ctx, log, bmInventory, pullSecret, + RegisterOptions.ClusterDeploymentFile, RegisterOptions.AgentClusterInstallFile, RegisterOptions.ClusterImageSetFile, RegisterOptions.ReleaseImageMirror) + if err != nil { + log.Fatal("Failed to register cluster with assisted-service: ", err) + } + + err = agentbasedinstaller.RegisterExtraManifests(os.DirFS(RegisterOptions.ExtraManifests), ctx, log, bmInventory.Manifests, modelsCluster) + if err != nil { + log.Fatal("Failed to register extra manifests with assisted-service: ", err) + } + + return modelsCluster.ID.String() +} + +func registerInfraEnv(ctx context.Context, log *log.Logger, bmInventory *client.AssistedInstall) string { + err := envconfig.Process("", &RegisterOptions) + if err != nil { + log.Fatal(err.Error()) + } + + existingInfraEnv, err := agentbasedinstaller.GetInfraEnv(ctx, log, bmInventory) + if err == nil { + log.Infof("Skipping infraenv registration. Found existing infraenv with id: %s", existingInfraEnv.ID.String()) + return existingInfraEnv.ID.String() + } + + pullSecret, err := agentbasedinstaller.GetPullSecret(RegisterOptions.PullSecretFile) + if err != nil { + log.Fatal("Failed to get pull secret: ", err.Error()) + } + + modelsCluster, err := agentbasedinstaller.GetCluster(ctx, log, bmInventory) + if err != nil { + log.Fatal("Failed to find cluster when registering infraenv: ", err) + } else { + log.Infof("Reference to cluster id: %s", modelsCluster.ID.String()) + } + + modelsInfraEnv, err := agentbasedinstaller.RegisterInfraEnv(ctx, log, bmInventory, pullSecret, + modelsCluster, RegisterOptions.InfraEnvFile, RegisterOptions.NMStateConfigFile, RegisterOptions.ImageTypeISO) + if err != nil { + log.Fatal("Failed to register infraenv with assisted-service: ", err) + } + + return modelsInfraEnv.ID.String() +} + func configure(ctx context.Context, log *log.Logger, bmInventory *client.AssistedInstall) { err := envconfig.Process("", &ConfigureOptions) if err != nil { diff --git a/cmd/agentbasedinstaller/register.go b/cmd/agentbasedinstaller/register.go index cc5e92f3033..77782d02ff1 100644 --- a/cmd/agentbasedinstaller/register.go +++ b/cmd/agentbasedinstaller/register.go @@ -193,6 +193,40 @@ func RegisterExtraManifests(fsys fs.FS, ctx context.Context, log *log.Logger, cl return nil } +func GetCluster(ctx context.Context, log *log.Logger, bmInventory *client.AssistedInstall) (cluster *models.Cluster, err error) { + list, err := bmInventory.Installer.V2ListClusters(ctx, &installer.V2ListClustersParams{}) + if err != nil { + return nil, err + } + clusterList := list.Payload + numClusters := len(clusterList) + if numClusters > 1 { + errorMessage := "found multiple clusters registered in assisted-service" + return nil, errors.New(errorMessage) + } + if numClusters == 0 { + return nil, errors.New("No clusters registered in assisted-service") + } + return clusterList[0], nil +} + +func GetInfraEnv(ctx context.Context, log *log.Logger, bmInventory *client.AssistedInstall) (infraEnv *models.InfraEnv, err error) { + list, err := bmInventory.Installer.ListInfraEnvs(ctx, &installer.ListInfraEnvsParams{}) + if err != nil { + return nil, err + } + infraEnvList := list.Payload + numInfraEnvs := len(infraEnvList) + if numInfraEnvs > 1 { + errorMessage := "found multiple infraenvs registered in assisted-service" + return nil, errors.New(errorMessage) + } + if numInfraEnvs == 0 { + return nil, errors.New("No infraenvs registered in assisted-service") + } + return infraEnvList[0], nil +} + // Read a Yaml file and unmarshal the contents func getFileData(filePath string, output interface{}) error {