Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 61 additions & 13 deletions cmd/boot/bmc/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,12 @@ import (
boot_service_client "github.com/openchami/boot-service/pkg/client"
"github.com/spf13/cobra"

api "github.com/openchami/boot-service/apis/boot.openchami.io/v1"

"github.com/OpenCHAMI/ochami/internal/cli"
boot_service_lib "github.com/OpenCHAMI/ochami/internal/cli/boot_service"
"github.com/OpenCHAMI/ochami/internal/log"
"github.com/OpenCHAMI/ochami/pkg/client/boot_service"
)

func newCmdBootBmcAdd() *cobra.Command {
Expand All @@ -27,6 +30,7 @@ See ochami-boot(1) for more details.`,
Example: ` # Add BMC using payload data
ochami boot bmc add -d \
Comment thread
synackd marked this conversation as resolved.
'{
"name": "bmc01",
"xname": "x1000c0s0b0",
"description": "This node's BMC",
"interface": {
Expand All @@ -40,6 +44,7 @@ See ochami-boot(1) for more details.`,
ochami boot bmc add -d \
Comment thread
synackd marked this conversation as resolved.
'[
{
"name": "bmc01",
"xname": "x1000c0s0b0",
"description": "Node 1's BMC",
"interface": {
Expand All @@ -49,6 +54,7 @@ See ochami-boot(1) for more details.`,
}
},
{
"name": "bmc02",
"xname": "x1000c0s0b1",
"description": "Node 2's BMC",
"interface": {
Expand All @@ -59,6 +65,20 @@ See ochami-boot(1) for more details.`,
}
]'

# Add BMC preserving labels/annotations (envelope API)
ochami boot bmc add -e -d \
'{
"metadata": {
"name": "x1000c0s0b0",
"labels": {
"env": "prod"
}
},
"spec": {
"xname": "x1000c0s0b0"
}
}'

# Add BMCs using input payload file
ochami boot bmc add -d @payload.json
ochami boot bmc add -d @payload.yaml -f yaml
Expand All @@ -75,32 +95,60 @@ See ochami-boot(1) for more details.`,
// Handle token for this command
cli.HandleToken(cmd)

// Read node data
bmcs := []boot_service_client.CreateBMCRequest{}
if cmd.Flag("data").Changed {
cli.HandlePayloadSlice[boot_service_client.CreateBMCRequest](cmd, &bmcs)
// Determine how to read payload (simple versus advanced API)
envelope, flagErr := cmd.Flags().GetBool("envelope")
if flagErr != nil {
log.Logger.Warn().Err(flagErr).Msg("failed to read --envelope, falling back to simple API")
}

var bmcsCreated []*api.BMC
var reqErrs []error
var reqErr error
if envelope {
// Use advanced API (spec, metadata, annotations)

// Read node data
bmcs := []boot_service_client.CreateBMCRequest{}
if cmd.Flag("data").Changed {
cli.HandlePayloadSlice[boot_service_client.CreateBMCRequest](cmd, &bmcs)
} else {
cli.HandlePayloadStdinSlice[boot_service_client.CreateBMCRequest](cmd, &bmcs)
}

// Send off requests
bmcsCreated, reqErrs, reqErr = bootServiceClient.AddBMCs(cli.Token, bmcs)
} else {
cli.HandlePayloadStdinSlice[boot_service_client.CreateBMCRequest](cmd, &bmcs)
// Use simple API (spec)

// Read node data
bmcs := []boot_service.BMCSpec{}
if cmd.Flag("data").Changed {
cli.HandlePayloadSlice[boot_service.BMCSpec](cmd, &bmcs)
} else {
cli.HandlePayloadStdinSlice[boot_service.BMCSpec](cmd, &bmcs)
}

// Send off requests
bmcsCreated, reqErrs, reqErr = bootServiceClient.AddBMCSpecs(cli.Token, bmcs)
}

// Send off requests
bmcsCreated, errs, err := bootServiceClient.AddBMCs(cli.Token, bmcs)
if err != nil {
log.Logger.Error().Err(err).Msg("failed to add BMCs")
// Handle any non-request error
if reqErr != nil {
log.Logger.Error().Err(reqErr).Msg("failed to add BMCs")
cli.LogHelpError(cmd)
os.Exit(1)
}

// Deal with per-request errors
var errorsOccurred = false
for _, err := range errs {
var reqErrorsOccurred = false
for _, err := range reqErrs {
if err != nil {
log.Logger.Error().Err(err).Msg("failed to add BMC")
errorsOccurred = true
reqErrorsOccurred = true
}
}
log.Logger.Debug().Msgf("BMCs created: %+v", bmcsCreated)
if errorsOccurred {
if reqErrorsOccurred {
cli.LogHelpError(cmd)
log.Logger.Warn().Msg("BMC addition completed with errors")
os.Exit(1)
Expand Down
3 changes: 3 additions & 0 deletions cmd/boot/bmc/bmc.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ See ochami-boot(1) for more details.`,
},
}

// Create flags
bootBmcCmd.PersistentFlags().BoolP("envelope", "e", false, "use the envelope (advanced) API, preserving metadata/labels/annotations, instead of the simple API")

// Add subcommands
bootBmcCmd.AddCommand(
newCmdBootBmcAdd(),
Expand Down
60 changes: 50 additions & 10 deletions cmd/boot/bmc/set.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import (
boot_service_client "github.com/openchami/boot-service/pkg/client"
"github.com/spf13/cobra"

api "github.com/openchami/boot-service/apis/boot.openchami.io/v1"

"github.com/OpenCHAMI/ochami/internal/cli"
boot_service_lib "github.com/OpenCHAMI/ochami/internal/cli/boot_service"
"github.com/OpenCHAMI/ochami/internal/log"
Expand All @@ -36,6 +38,19 @@ See ochami-boot(1) for more details.`,
}
}'

# Set BMC details preserving labels/annotations (envelope API)
ochami boot bmc set bmc-773d99bf -e -d \
'{
"metadata": {
"labels": {
"env": "prod"
}
},
"spec": {
"xname": "x1000c0s0b0"
}
}'

# Set BMC details using input payload file
ochami boot bmc set -d @payload.json bmc-773d99bf
ochami boot bmc set -d @payload.yaml -f yaml bmc-773d99bf
Expand All @@ -52,18 +67,43 @@ See ochami-boot(1) for more details.`,
// Handle token for this command
cli.HandleToken(cmd)

// Read BMC data
bmc := boot_service_client.UpdateBMCRequest{}
if cmd.Flag("data").Changed {
cli.HandlePayload(cmd, &bmc)
} else {
cli.HandlePayloadStdin(cmd, &bmc)
// Determine how to read payload (simple versus advanced API)
envelope, flagErr := cmd.Flags().GetBool("envelope")
if flagErr != nil {
log.Logger.Warn().Err(flagErr).Msg("failed to read --envelope, falling back to simple API")
}

// Send off requests
bmcSet, err := bootServiceClient.SetBMC(cli.Token, args[0], bmc)
if err != nil {
log.Logger.Error().Err(err).Msg("failed to set bmc")
var bmcSet *api.BMC
var reqErr error
if envelope {
// Use advanced API (spec, metadata, annotations)

// Read BMC data
bmc := boot_service_client.UpdateBMCRequest{}
if cmd.Flag("data").Changed {
cli.HandlePayload(cmd, &bmc)
} else {
cli.HandlePayloadStdin(cmd, &bmc)
}

// Send off request
bmcSet, reqErr = bootServiceClient.SetBMC(cli.Token, args[0], bmc)
} else {
// Use simple API (spec)

// Read BMC data
spec := api.BMCSpec{}
if cmd.Flag("data").Changed {
cli.HandlePayload(cmd, &spec)
} else {
cli.HandlePayloadStdin(cmd, &spec)
}

// Send off request
bmcSet, reqErr = bootServiceClient.SetBMCSpec(cli.Token, args[0], spec)
}
if reqErr != nil {
log.Logger.Error().Err(reqErr).Msg("failed to set bmc")
cli.LogHelpError(cmd)
os.Exit(1)
}
Expand Down
75 changes: 62 additions & 13 deletions cmd/boot/config/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,12 @@ import (
boot_service_client "github.com/openchami/boot-service/pkg/client"
"github.com/spf13/cobra"

api "github.com/openchami/boot-service/apis/boot.openchami.io/v1"

"github.com/OpenCHAMI/ochami/internal/cli"
boot_service_lib "github.com/OpenCHAMI/ochami/internal/cli/boot_service"
"github.com/OpenCHAMI/ochami/internal/log"
"github.com/OpenCHAMI/ochami/pkg/client/boot_service"
)

func newCmdBootConfigAdd() *cobra.Command {
Expand All @@ -27,6 +30,7 @@ See ochami-boot(1) for more details.`,
Example: ` # Add boot configuration using payload data
ochami boot config add -d \
'{
"name": "compute-boot",
"hosts": [
"item1",
"item2"
Expand All @@ -53,13 +57,15 @@ See ochami-boot(1) for more details.`,
ochami boot config add -d \
'[
{
"name": "boot-by-host",
"hosts": ["host1"],
"kernel": "http://s3.openchami.cluster/kernels/vmlinuz1",
"initrd": "http://s3.openchami.cluster/initrds/initramfs1.img",
"params": "console=tty0,115200n8 console=ttyS0,115200n8",
"priority": 42
},
{
"name": "boot-by-mac",
"macs": ["de:ca:fc:0f:fe:ee"],
"kernel": "http://s3.openchami.cluster/kernels/vmlinuz2",
"initrd": "http://s3.openchami.cluster/initrds/initramfs2.img",
Expand All @@ -68,6 +74,21 @@ See ochami-boot(1) for more details.`,
}
]'

# Add boot configuration preserving labels/annotations (envelope API)
ochami boot config add -e -d \
'{
"metadata": {
"name": "compute-boot",
"labels": {
"env": "prod"
}
},
"spec": {
"hosts": ["item1"],
"kernel": "http://s3.openchami.cluster/kernels/vmlinuz1"
}
}'

# Add boot configuration using input payload file
ochami boot config add -d @payload.json
ochami boot config add -d @payload.yaml -f yaml
Expand All @@ -84,32 +105,60 @@ See ochami-boot(1) for more details.`,
// Handle token for this command
cli.HandleToken(cmd)

// Read boot configuration data
bcs := []boot_service_client.CreateBootConfigurationRequest{}
if cmd.Flag("data").Changed {
cli.HandlePayloadSlice[boot_service_client.CreateBootConfigurationRequest](cmd, &bcs)
// Determine how to read payload (simple versus advanced API)
envelope, flagErr := cmd.Flags().GetBool("envelope")
if flagErr != nil {
log.Logger.Warn().Err(flagErr).Msg("failed to read --envelope, falling back to simple API")
}

var cfgsCreated []*api.BootConfiguration
var reqErrs []error
var reqErr error
if envelope {
// Use advanced API (spec, metadata, annotations)

// Read boot configuration data
bcs := []boot_service_client.CreateBootConfigurationRequest{}
if cmd.Flag("data").Changed {
cli.HandlePayloadSlice[boot_service_client.CreateBootConfigurationRequest](cmd, &bcs)
} else {
cli.HandlePayloadStdinSlice[boot_service_client.CreateBootConfigurationRequest](cmd, &bcs)
}

// Send off requests
cfgsCreated, reqErrs, reqErr = bootServiceClient.AddBootConfigs(cli.Token, bcs)
} else {
cli.HandlePayloadStdinSlice[boot_service_client.CreateBootConfigurationRequest](cmd, &bcs)
// Use simple API (spec)

// Read boot configuration data
bcs := []boot_service.BootConfigSpec{}
if cmd.Flag("data").Changed {
cli.HandlePayloadSlice[boot_service.BootConfigSpec](cmd, &bcs)
} else {
cli.HandlePayloadStdinSlice[boot_service.BootConfigSpec](cmd, &bcs)
}

// Send off requests
cfgsCreated, reqErrs, reqErr = bootServiceClient.AddBootConfigSpecs(cli.Token, bcs)
}

// Send off requests
cfgsCreated, errs, err := bootServiceClient.AddBootConfigs(cli.Token, bcs)
if err != nil {
log.Logger.Error().Err(err).Msg("failed to add boot configurations")
// Handle any non-request error
if reqErr != nil {
log.Logger.Error().Err(reqErr).Msg("failed to add boot configurations")
cli.LogHelpError(cmd)
os.Exit(1)
}

// Deal with per-request errors
var errorsOccurred = false
for _, err := range errs {
var reqErrorsOccurred = false
for _, err := range reqErrs {
if err != nil {
log.Logger.Error().Err(err).Msg("failed to add boot configuration")
errorsOccurred = true
reqErrorsOccurred = true
}
}
log.Logger.Debug().Msgf("boot configs created: %+v", cfgsCreated)
if errorsOccurred {
if reqErrorsOccurred {
cli.LogHelpError(cmd)
log.Logger.Warn().Msg("boot configuration addition completed with errors")
os.Exit(1)
Expand Down
3 changes: 3 additions & 0 deletions cmd/boot/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ See ochami-boot(1) for more details.`,
},
}

// Create flags
bootConfigCmd.PersistentFlags().BoolP("envelope", "e", false, "use the envelope (advanced) API, preserving metadata/labels/annotations, instead of the simple API")

// Add subcommands
bootConfigCmd.AddCommand(
newCmdBootConfigAdd(),
Expand Down
Loading
Loading