From 97c32d43f61db19a887c49535d620ec90439148f 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 8c5c493e59..c01291da17 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 d421b88827..87573e388a 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 {