From 980bd82b9b589ed1632a24ef360f0455f3f124e8 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Thu, 18 Jan 2024 11:01:48 -0600 Subject: [PATCH] ngi Signed-off-by: Jacob Salmela --- cmd/session/session_init.go | 4 +- cmd/taxonomy/taxonomy.go | 3 +- internal/domain/domain.go | 6 + internal/provider/hpcm/import.go | 9 +- internal/provider/hpcm/translate.go | 64 +++++--- .../provider/hpcm/translate_hpcm_config.go | 153 ++++++++---------- internal/provider/hpcm/validate_external.go | 2 +- internal/provider/hpcm/validate_hpcm_cmdb.go | 4 +- internal/provider/hpengi/hpengi.go | 1 + internal/provider/hpengi/import.go | 65 ++++---- internal/provider/hpengi/init.go | 7 +- internal/provider/hpengi/validate_external.go | 20 ++- 12 files changed, 189 insertions(+), 149 deletions(-) diff --git a/cmd/session/session_init.go b/cmd/session/session_init.go index 9f5f060d..89b8ad03 100644 --- a/cmd/session/session_init.go +++ b/cmd/session/session_init.go @@ -56,10 +56,10 @@ func initSessionWithProviderCmd(cmd *cobra.Command, args []string) (err error) { switch root.D.Provider { case taxonomy.CSM: root.D.DatastorePath = filepath.Join(config.ConfigDir, taxonomy.DsFileCSM) - case taxonomy.Hpengi: - root.D.DatastorePath = filepath.Join(config.ConfigDir, taxonomy.DsFile) case taxonomy.HPCM: root.D.DatastorePath = filepath.Join(config.ConfigDir, taxonomy.DsFile) + case taxonomy.Hpengi: + root.D.DatastorePath = filepath.Join(config.ConfigDir, taxonomy.DsFile) default: err = fmt.Errorf("not a valid provider: %s", root.D.Provider) } diff --git a/cmd/taxonomy/taxonomy.go b/cmd/taxonomy/taxonomy.go index 9c3b5894..a114135e 100644 --- a/cmd/taxonomy/taxonomy.go +++ b/cmd/taxonomy/taxonomy.go @@ -36,6 +36,7 @@ const ( App = "cani" CSM = "csm" HPCM = "hpcm" + Hpengi = "hpengi" DsFile = App + "db.json" DsFileCSM = App + "db.json" LogFile = App + "db.log" @@ -50,7 +51,7 @@ const ( var ( DsPath = filepath.Join(CfgDir, DsFile) CfgPath = filepath.Join(CfgDir, CfgFile) - SupportedProviders = []string{CSM, HPCM} + SupportedProviders = []string{CSM, Hpengi, HPCM} ) func Init() { diff --git a/internal/domain/domain.go b/internal/domain/domain.go index 18d23001..a230a942 100644 --- a/internal/domain/domain.go +++ b/internal/domain/domain.go @@ -35,6 +35,7 @@ import ( "github.com/Cray-HPE/cani/internal/provider" "github.com/Cray-HPE/cani/internal/provider/csm" "github.com/Cray-HPE/cani/internal/provider/hpcm" + "github.com/Cray-HPE/cani/internal/provider/hpengi" "github.com/Cray-HPE/cani/pkg/hardwaretypes" "github.com/google/uuid" "github.com/rs/zerolog/log" @@ -93,6 +94,8 @@ func (d *Domain) SetupDomain(cmd *cobra.Command, args []string, configDomains ma d.datastore, err = inventory.NewDatastoreJSONCSM(d.DatastorePath, d.LogFilePath, inventory.Provider(d.Provider)) case taxonomy.HPCM: d.datastore, err = inventory.NewDatastoreJSON(d.DatastorePath, d.LogFilePath, inventory.Provider(d.Provider)) + case taxonomy.Hpengi: + d.datastore, err = inventory.NewDatastoreJSON(d.DatastorePath, d.LogFilePath, inventory.Provider(d.Provider)) default: return fmt.Errorf("invalid provider: %s", d.Provider) } @@ -121,6 +124,8 @@ func (d *Domain) SetupDomain(cmd *cobra.Command, args []string, configDomains ma d.externalInventoryProvider, err = csm.New(cmd, args, d.hardwareTypeLibrary, d.Options) case taxonomy.HPCM: d.externalInventoryProvider, err = hpcm.New(cmd, args, d.hardwareTypeLibrary, d.Options) + case taxonomy.Hpengi: + d.externalInventoryProvider, err = hpengi.New(cmd, args, d.hardwareTypeLibrary, d.Options) default: return fmt.Errorf("unknown external inventory provider provided (%s)", d.Provider) } @@ -173,6 +178,7 @@ func GetProviders() []provider.InventoryProvider { supportedProviders := []provider.InventoryProvider{ &csm.CSM{}, &hpcm.Hpcm{}, + &hpengi.Hpengi{}, } return supportedProviders } diff --git a/internal/provider/hpcm/import.go b/internal/provider/hpcm/import.go index 772a16c8..7eb465cd 100644 --- a/internal/provider/hpcm/import.go +++ b/internal/provider/hpcm/import.go @@ -39,11 +39,18 @@ func (hpcm *Hpcm) ImportInit(cmd *cobra.Command, args []string, datastore invent } // translate external inventory data to cani hardware entries - err = hpcm.Translate(cmd, args, ds) + translated, err := hpcm.Translate(cmd, args) if err != nil { return err } + for _, hw := range translated { + err = ds.Add(hw) + if err != nil { + return err + } + } + // merge the temp datastore with the existing one err = datastore.Merge(ds) if err != nil { diff --git a/internal/provider/hpcm/translate.go b/internal/provider/hpcm/translate.go index 1bcb2d1f..eeeb06df 100644 --- a/internal/provider/hpcm/translate.go +++ b/internal/provider/hpcm/translate.go @@ -39,32 +39,24 @@ import ( "github.com/spf13/cobra" ) -func (hpcm *Hpcm) Translate(cmd *cobra.Command, args []string, ds inventory.Datastore) (err error) { - var translated = map[uuid.UUID]*inventory.Hardware{} +func (hpcm *Hpcm) Translate(cmd *cobra.Command, args []string) (translated map[uuid.UUID]*inventory.Hardware, err error) { + // translated = make(map[uuid.UUID]*inventory.Hardware, 0) // check if input is coming from a cm config file if cmd.Flags().Changed("cm-config") { - translated, err = hpcm.TranslateCmConfig() + translated, err = hpcm.CmConfig.TranslateCmConfig() if err != nil { - return err + return translated, err } // by default, translate information from the cmdb } else { translated, err = hpcm.TranslateCmdb() if err != nil { - return err + return translated, err } } - // add the translated hardware to the datastore - for _, hw := range translated { - err = ds.Add(hw) - if err != nil { - return err - } - } - - return nil + return translated, nil } // extractProviderMetadata is a catchall function for HPCM data that doesn't fit elsewhere @@ -206,6 +198,33 @@ func setupTempDatastore(datastore inventory.Datastore) (temp inventory.Datastore return temp, nil } +func hpcmLocToCaniType(cmloc hpcm_client.LocationSettings) (string, error) { + if &cmloc.Rack == nil { + log.Info().Msgf("%+v", "rack nil") + } + if &cmloc.Chassis == nil { + log.Info().Msgf("%+v", "chassis nil") + } + if &cmloc.Tray == nil { + log.Info().Msgf("%+v", "tray nil") + } + if &cmloc.Controller == nil { + log.Info().Msgf("%+v", "controller nil") + } + if &cmloc.Node == nil { + log.Info().Msgf("%+v", "node nil") + } + system := inventory.LocationToken{HardwareType: hardwaretypes.System, Ordinal: 0} + cabinet := inventory.LocationToken{HardwareType: hardwaretypes.Cabinet, Ordinal: int(cmloc.Rack)} + chassis := inventory.LocationToken{HardwareType: hardwaretypes.Chassis, Ordinal: int(cmloc.Chassis)} + blade := inventory.LocationToken{HardwareType: hardwaretypes.NodeBlade, Ordinal: int(cmloc.Tray)} + bmc := inventory.LocationToken{HardwareType: hardwaretypes.NodeController, Ordinal: int(cmloc.Controller)} + node := inventory.LocationToken{HardwareType: hardwaretypes.Node, Ordinal: int(cmloc.Node)} + lp := inventory.LocationPath{system, cabinet, chassis, blade, bmc, node} + + return lp.GetHardwareTypePath().Key(), nil +} + // hpcmLocToCaniLoc translates hpcm location keys to a cani location path func hpcmLocToCaniLoc(caniHwType hardwaretypes.HardwareType, hpcmLoc *hpcm_client.LocationSettings) (caniLoc inventory.LocationPath, err error) { // HPCM ---> CANI @@ -215,7 +234,7 @@ func hpcmLocToCaniLoc(caniHwType hardwaretypes.HardwareType, hpcmLoc *hpcm_clien // Tray ---> NodeBlade/SwitchBlade // Controller ---> NodeController // Node ---> Node - var system, cabinet, chassis, blade, node inventory.LocationToken + var system, cabinet, chassis, blade, controller, node inventory.LocationToken // rack and chassis map to cabinet and chassis system = inventory.LocationToken{HardwareType: hardwaretypes.System, Ordinal: 0} cabinet = inventory.LocationToken{HardwareType: hardwaretypes.Cabinet, Ordinal: int(hpcmLoc.Rack)} @@ -241,10 +260,16 @@ func hpcmLocToCaniLoc(caniHwType hardwaretypes.HardwareType, hpcmLoc *hpcm_clien caniLoc = inventory.LocationPath{system, cabinet, chassis, blade} case hardwaretypes.Node: blade = inventory.LocationToken{HardwareType: hardwaretypes.NodeBlade, Ordinal: int(hpcmLoc.Tray)} + controller = inventory.LocationToken{HardwareType: hardwaretypes.NodeController, Ordinal: int(hpcmLoc.Controller)} node = inventory.LocationToken{HardwareType: hardwaretypes.Node, Ordinal: int(hpcmLoc.Node)} - caniLoc = inventory.LocationPath{system, cabinet, chassis, blade, node} + caniLoc = inventory.LocationPath{system, cabinet, chassis, blade, controller, node} default: - log.Warn().Msgf("Unable to get LocationPath from hardware type: %v", caniHwType) + // assume a node + blade = inventory.LocationToken{HardwareType: hardwaretypes.NodeBlade, Ordinal: int(hpcmLoc.Tray)} + controller = inventory.LocationToken{HardwareType: hardwaretypes.NodeController, Ordinal: int(hpcmLoc.Controller)} + node = inventory.LocationToken{HardwareType: hardwaretypes.Node, Ordinal: int(hpcmLoc.Node)} + caniLoc = inventory.LocationPath{system, cabinet, chassis, blade, controller, node} + // log.Warn().Msgf("Unable to get LocationPath from hardware type: %v", caniHwType) } log.Debug().Msgf("Set LocationPath via HPCM geo location values: %+v -> %v", hpcmLoc, caniLoc) @@ -273,8 +298,11 @@ func hpcmTypeToCaniHardwareType(hpcmType string) (t hardwaretypes.HardwareType, t = hardwaretypes.CabinetPDU case "switch_blade": t = hardwaretypes.ManagementSwitchEnclosure + case "": + // assume anything else is a node. this may be a mistake + t = hardwaretypes.Node default: - err = fmt.Errorf("unabled to map HPCM type to CANI hardwaretype: %v", hpcmType) + err = fmt.Errorf("unable to map HPCM type to CANI hardwaretype: %v", hpcmType) } if err != nil { return t, err diff --git a/internal/provider/hpcm/translate_hpcm_config.go b/internal/provider/hpcm/translate_hpcm_config.go index 48f135ea..5605299a 100644 --- a/internal/provider/hpcm/translate_hpcm_config.go +++ b/internal/provider/hpcm/translate_hpcm_config.go @@ -26,8 +26,6 @@ package hpcm import ( - "fmt" - "github.com/Cray-HPE/cani/cmd/taxonomy" "github.com/Cray-HPE/cani/internal/inventory" hpcm_client "github.com/Cray-HPE/cani/pkg/hpcm-client" @@ -36,108 +34,87 @@ import ( ) // TranslateCmConfigToCaniHw translates data from Hpcm.CmConfig to CANI format -func (hpcm *Hpcm) TranslateCmConfig() (translated map[uuid.UUID]*inventory.Hardware, err error) { +func (cm HpcmConfig) TranslateCmConfig() (translated map[uuid.UUID]*inventory.Hardware, err error) { translated = make(map[uuid.UUID]*inventory.Hardware, 0) - for _, d := range hpcm.CmConfig.Discover { + for _, d := range cm.Discover { log.Debug().Msgf("Translating %s hardware to %s format (%+v)", "HPCM", taxonomy.App, d.Hostname1) - hw := &inventory.Hardware{} - - // translate the hpcm fields to cani fields - err = TranslateCmHardwareToCaniHw(d, hpcm.CmConfig, hw) - if err != nil { - return translated, err - } - // add the hardware to the map if it does not exist - _, exists := translated[hw.ID] - if exists { - return translated, fmt.Errorf("Hardware already exists: %s", hw.ID) - } - translated[hw.ID] = hw + _ = d.getModel() + // // translate the hpcm fields to cani fields + // t, err := TranslateCmHardwareToCaniHw(d, cm) + // if err != nil { + // return translated, err + // } + + // // add the hardware to the map if it does not exist + // _, exists := translated[t.ID] + // if exists { + // return translated, fmt.Errorf("Hardware already exists: %s", hw.ID) + // } + // translated[hw.ID] = hw } // return the map of translated hpcm --> cani hardware return translated, nil } -func TranslateCmHardwareToCaniHw(d Discover, cm HpcmConfig, hw *inventory.Hardware) (err error) { - // create a uuid for the new hardware - u := uuid.New() - log.Debug().Msgf(" Unique Identifier: --> %s: %+v", "ID", u) - hw.ID = u - - // Convert HPCM type to cani hardwaretypes - t, err := hpcmTypeToCaniHardwareType(d.Type) - if err != nil { - return err - } - hw.Type = t - log.Debug().Msgf(" type: %s --> %s: %s", d.Type, "Type", t) - - // Convert HPCM template name to cani device type slug - s := hpcmCmTemplateNameToCaniSlug(d, cm) - if err != nil { - return err - } - hw.DeviceTypeSlug = s - log.Debug().Msgf(" template_name: %s --> %s: %s", d.TemplateName, "DeviceTypeSlug", s) +func (cm HpcmConfig) TranslateCmHardwareToCaniHw() (translated map[uuid.UUID]*inventory.Hardware, err error) { + translated = make(map[uuid.UUID]*inventory.Hardware, 0) - // Convert HPCM card type to cani vendor - v := hpcmCmCardTypeToCaniVendor(d, cm) - if err != nil { - return err - } - hw.Vendor = v - log.Debug().Msgf(" card_type: %s --> %s: %s", d.CardType, "Vendor", v) + for _, d := range cm.Discover { + hw := &inventory.Hardware{} + hw.ID = uuid.New() - // Convert HPCM card type to cani vendor - cmloc := &hpcm_client.LocationSettings{ - Rack: int32(d.RackNr), - Chassis: int32(d.Chassis), - Tray: int32(d.Tray), - Node: int32(d.NodeNr), - Controller: int32(d.ControllerNr), - } - lp, err := hpcmLocToCaniLoc(hw.Type, cmloc) - if err != nil { - return err - } - hw.LocationPath = lp - log.Debug().Msgf(" *_nr: %d->%d->%d->%d --> %s: %s", - d.RackNr, - d.Chassis, - d.Tray, - d.NodeNr, - "LocationPath", lp.String()) + // Convert HPCM type to cani hardwaretypes + t, err := hpcmTypeToCaniHardwareType(d.Type) + if err != nil { + return translated, err + } + hw.Type = t + + // Convert HPCM location to cani location + cmloc := &hpcm_client.LocationSettings{ + Rack: int32(d.RackNr), + Chassis: int32(d.Chassis), + Tray: int32(d.Tray), + Controller: int32(d.ControllerNr), + Node: int32(d.NodeNr), + } - // these fields map 1:1 and are not necessarily required, so just fill them - hw.LocationOrdinal = &d.NodeNr - log.Debug().Msgf(" node_nr: %d --> %s: %d", d.NodeNr, "LocationOrdinal", *hw.LocationOrdinal) - hw.Architecture = d.Architecture - log.Debug().Msgf(" %s: %s %s %s: %s", "architecture", d.Architecture, "-->", "Architecture", hw.Architecture) - hw.Model = d.TemplateName - // log.Debug().Msgf(" %s: %s %s %s: %s", "template_name", d.TemplateName, "-->", "Model", hw.Model) - hw.Name = d.Hostname1 - log.Debug().Msgf(" %s: %s %s %s: %s", "hostname1", d.Hostname1, "-->", "Name", hw.Name) - log.Debug().Msgf("") + lp, err := hpcmLocToCaniLoc(hw.Type, cmloc) + if err != nil { + return translated, err + } - return nil -} + hw.LocationPath = lp + hw.Architecture = d.Architecture + hw.Model = d.TemplateName + hw.Name = d.Hostname1 -// hpcmCmCardTypeToCaniVendor -func hpcmCmCardTypeToCaniVendor(d Discover, cm HpcmConfig) (v string) { - switch d.CardType { - case "iLo": - v = "HPE" - case "Intel": - v = "Intel" - case "IPMI": - v = "IPMI" - default: - v = "Unknown" + _, exists := translated[hw.ID] + if !exists { + translated[hw.ID] = hw + } } + return translated, nil +} - return v +// getModel messily gets the model from a Discover object +func (d Discover) getModel() (model string) { + log.Info().Msgf("%+v", d) + // md := make(map[string]interface{}, 0) + // md["Inventory"] = make(map[string]interface{}, 0) + // mdInv := md["Inventory"].(map[string]interface{}) + // if node.Inventory != nil { + // inv := *node.Inventory + // for k, v := range inv.(map[string]interface{}) { + // if k == "fru.Model" { + // vendor = v.(string) + // } + // mdInv[k] = v + // } + // } + return model } // hpcmCmTemplateNameToCaniSlug diff --git a/internal/provider/hpcm/validate_external.go b/internal/provider/hpcm/validate_external.go index 143defb2..e7216ddb 100644 --- a/internal/provider/hpcm/validate_external.go +++ b/internal/provider/hpcm/validate_external.go @@ -52,7 +52,7 @@ func (hpcm *Hpcm) siteSurvey(cmd *cobra.Command, args []string) error { hpcm.CmConfig = cm // by default, import from the CMDB if no flags were passed } else { - err := hpcm.dumpCmdb(cmd, args) + err := hpcm.LoadCmdb(cmd, args) if err != nil { return err } diff --git a/internal/provider/hpcm/validate_hpcm_cmdb.go b/internal/provider/hpcm/validate_hpcm_cmdb.go index 625b1467..fac32b0f 100644 --- a/internal/provider/hpcm/validate_hpcm_cmdb.go +++ b/internal/provider/hpcm/validate_hpcm_cmdb.go @@ -40,10 +40,10 @@ import ( "golang.org/x/oauth2" ) -// dumpCmdb GETs endpoints from the CMDB and saves the results in the *Hpcm.Cmdb +// LoadCmdb GETs endpoints from the CMDB and saves the results in the *Hpcm.Cmdb // this is typically run during ValidateExternal so known-good data is added // TODO: add further validation checks -func (hpcm *Hpcm) dumpCmdb(cmd *cobra.Command, args []string) (err error) { +func (hpcm *Hpcm) LoadCmdb(cmd *cobra.Command, args []string) (err error) { // alertOpts := &hpcm_client.AlertOperationsApiGetAllOpts{} // alerts, _, err := hpcm.client.AlertOperationsApi.GetAll(hpcm.Options.context, alertOpts) // if err != nil { diff --git a/internal/provider/hpengi/hpengi.go b/internal/provider/hpengi/hpengi.go index 476dc028..df1d522f 100644 --- a/internal/provider/hpengi/hpengi.go +++ b/internal/provider/hpengi/hpengi.go @@ -38,6 +38,7 @@ type Hpengi struct { Options *HpengiOpts Cid Cid `json:"CID"` CmConfig hpcm.HpcmConfig `json:"CmConfig"` + HpcmCmdb hpcm.Cmdb `json:"HpcmCmdb"` Paddle *canu.Paddle `json:"Paddle"` SlsInput sls.SLSState `json:"SlsInputFile"` } diff --git a/internal/provider/hpengi/import.go b/internal/provider/hpengi/import.go index f6733fd4..4436b97b 100644 --- a/internal/provider/hpengi/import.go +++ b/internal/provider/hpengi/import.go @@ -31,6 +31,7 @@ import ( "github.com/Cray-HPE/cani/cmd/taxonomy" "github.com/Cray-HPE/cani/internal/inventory" + "github.com/Cray-HPE/cani/internal/provider/hpcm" "github.com/Cray-HPE/cani/pkg/canu" "github.com/google/uuid" "github.com/rs/zerolog/log" @@ -46,55 +47,51 @@ func (hpengi *Hpengi) ImportInit(cmd *cobra.Command, args []string, datastore in return err } - if cmd.Flags().Changed("sls-config") { - // get a map of translated hardware from the hpcm config - toImport, err := hpengi.translateSlsDumpstateToCaniHw(cmd, args) + if cmd.Flags().Changed("cm-config") { + f, _ := cmd.Flags().GetString("cm-config") + cm, err := hpcm.LoadCmConfig(f) if err != nil { return err } - // import each hardware - for _, hw := range toImport { - log.Info().Msgf("Importing %+v", hw.Name) - err = ds.Add(hw) - if err != nil { - return err - } + translated, err = cm.TranslateCmHardwareToCaniHw() + if err != nil { + return err + } + } + + if cmd.Flags().Changed("sls-config") { + // get a map of translated hardware from the hpcm config + translated, err = hpengi.translateSlsDumpstateToCaniHw(cmd, args) + if err != nil { + return err } } if cmd.Flags().Changed("paddle") { // get a map of translated hardware from the hpcm config - toImport, err := hpengi.translatePaddleToCaniHw(cmd, args) + translated, err = hpengi.translatePaddleToCaniHw(cmd, args) if err != nil { return err } - // import each hardware - for _, hw := range toImport { - log.Info().Msgf("Importing %+v", hw.Name) - err = ds.Add(hw) - if err != nil { - return err - } + } + + if cmd.Flags().Changed("cmdb") { + // translate external inventory data to cani hardware entries + translated, err = hpcmObj.Translate(cmd, args) + if err != nil { + return err } } - // if cmd.Flags().Changed("cm-config") { - // // get a map of translated hardware from the hpcm config - // toImport, err := hpcm.TranslateCmConfigToCaniHw(cmd, args) - // if err != nil { - // return err - // } - - // // import each hardware - // for _, hw := range toImport { - // log.Info().Msgf("Importing %+v", hw.Name) - // err = ds.Add(hw) - // if err != nil { - // return err - // } - // } - // } + // all flags will return a map of translated hardware + // loop through that, and add it each to the datastore + for _, hw := range translated { + err = ds.Add(hw) + if err != nil { + return err + } + } // merge the datastore if all is successful err = datastore.Merge(ds) diff --git a/internal/provider/hpengi/init.go b/internal/provider/hpengi/init.go index 3ebf72a9..35ecb9ca 100644 --- a/internal/provider/hpengi/init.go +++ b/internal/provider/hpengi/init.go @@ -12,8 +12,13 @@ func init() { func NewSessionInitCommand(caniCmd *cobra.Command) (cmd *cobra.Command, err error) { cmd = utils.CloneCommand(caniCmd) - cmd.Flags().StringP("cid", "c", "", "Path to a Smart Customer Intent Document") + cmd.Flags().StringP("cid", "i", "", "Path to a Smart Customer Intent Document") cmd.Flags().StringP("cm-config", "C", "", "Path to a HPCM config file/cluster manager file/cluster definition file") + cmd.Flags().Bool("cmdb", false, "Import from the CMDB") + cmd.Flags().String("cmdb-url", "cmu/v1", "Base URL for the CMDB") + cmd.Flags().String("host", "localhost:8080", "Host or FQDN for APIs") + cmd.Flags().String("cacert", "", "Path to the CA certificate file") + cmd.Flags().String("token", "", "API token") cmd.Flags().StringP("paddle", "P", "", "Path to a Paddle/CCJ/machine-readable SHCD file") cmd.Flags().StringP("sls-dumpstate", "s", "", "Path to a SLS input/dumpstate file") return cmd, nil diff --git a/internal/provider/hpengi/validate_external.go b/internal/provider/hpengi/validate_external.go index bc30c4de..e5334074 100644 --- a/internal/provider/hpengi/validate_external.go +++ b/internal/provider/hpengi/validate_external.go @@ -33,13 +33,20 @@ import ( "strings" "syscall" + "github.com/Cray-HPE/cani/internal/inventory" "github.com/Cray-HPE/cani/internal/provider/hpcm" "github.com/Cray-HPE/cani/pkg/canu" sls "github.com/Cray-HPE/hms-sls/v2/pkg/sls-common" + "github.com/google/uuid" "github.com/spf13/cobra" "golang.org/x/term" ) +var ( + translated = make(map[uuid.UUID]*inventory.Hardware, 0) + hpcmObj = &hpcm.Hpcm{} +) + // ValidateExternal func (hpengi *Hpengi) ValidateExternal(cmd *cobra.Command, args []string) error { // hpengi may be a brand new system but could also be a migration from a different provider @@ -56,13 +63,24 @@ func (hpengi *Hpengi) ValidateExternal(cmd *cobra.Command, args []string) error func (hpengi *Hpengi) siteSurvey(cmd *cobra.Command, args []string) error { // [non]interactively get the hpcm cluster config file if one is passed in if cmd.Flags().Changed("cm-config") { - cm, err := hpengi.getCmConfig(cmd, args) + f, _ := cmd.Flags().GetString("cm-config") + cm, err := hpcm.LoadCmConfig(f) if err != nil { return err } hpengi.CmConfig = cm } + // validate the customer intent document if one is passed in + if cmd.Flags().Changed("cmdb") { + err := hpcmObj.LoadCmdb(cmd, args) + if err != nil { + return err + } + + hpengi.HpcmCmdb = hpcmObj.Cmdb + } + // validate the customer intent document if one is passed in if cmd.Flags().Changed("cid") { cid, err := hpengi.getSmartCid(cmd, args)