From 5545f62eca2215bc6ed6a22b5b4a68e0d37cf85f Mon Sep 17 00:00:00 2001 From: Richard Su Date: Thu, 20 Jul 2023 00:34:30 +0800 Subject: [PATCH] AGENT-557: Split register into registerCluster and registerInfraEnv The split is desired to enable the interactive flow. Users will register the cluster through the GUI instead of including the cluster information in the ignition/agent ISO. registerCluster is able to detect if a cluster has already been registered with the REST-API and exits with status 0, skipping cluster registration from manifest files. registerInfraEnv requires and checks that a cluster has been registered with the REST-API. It also skips infraenv registration if it detects one has already been created. Signed-off-by: Richard Su --- cmd/agentbasedinstaller/client/main.go | 71 ++++++++++++++++++++++++++ cmd/agentbasedinstaller/register.go | 34 ++++++++++++ 2 files changed, 105 insertions(+) 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 {