Skip to content
Open
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
24 changes: 14 additions & 10 deletions powershelf-manager/internal/proto/v1/powershelf-manager.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ service PowershelfManager {
enum PMCVendor {
PMC_TYPE_UNKNOWN = 0;
PMC_TYPE_LITEON = 1;
PMC_TYPE_DELTA = 2;
}

// Credentials wraps around a username and password
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions powershelf-manager/pkg/common/vendor/vendor.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,13 @@ type VendorCode int
const (
VendorCodeUnsupported VendorCode = iota
VendorCodeLiteon
VendorCodeDelta
VendorCodeMax
)

const (
VendorLiteon = "Liteon"
VendorDelta = "Delta"
)

// CodeToVendor maps a vendor code to a Vendor struct.
Expand All @@ -46,6 +48,8 @@ func CodeToVendor(code VendorCode) Vendor {
switch code {
case VendorCodeLiteon:
v = VendorLiteon
case VendorCodeDelta:
v = VendorDelta
default:
v = "Unsupported"
}
Expand All @@ -60,6 +64,8 @@ func StringToVendor(v string) Vendor {
switch v {
case VendorLiteon:
code = VendorCodeLiteon
case VendorDelta:
code = VendorCodeDelta
default:
code = VendorCodeUnsupported
}
Expand Down
29 changes: 27 additions & 2 deletions powershelf-manager/pkg/common/vendor/vendor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,12 @@ func TestCodeToVendor(t *testing.T) {
wantName: VendorLiteon,
wantSupport: true,
},
"delta code -> Delta vendor": {
inCode: VendorCodeDelta,
wantCode: VendorCodeDelta,
wantName: VendorDelta,
wantSupport: true,
},
"max sentinel -> Unsupported vendor": {
inCode: VendorCodeMax,
wantCode: VendorCodeMax,
Expand Down Expand Up @@ -80,6 +86,13 @@ func TestStringToVendor(t *testing.T) {
wantString: VendorLiteon,
wantSupport: true,
},
"Delta name -> Delta code": {
inName: VendorDelta,
wantCode: VendorCodeDelta,
wantName: VendorDelta,
wantString: VendorDelta,
wantSupport: true,
},
"unknown name -> Unsupported code": {
inName: "FooCorp",
wantCode: VendorCodeUnsupported,
Expand Down Expand Up @@ -129,6 +142,10 @@ func TestVendorIsSupported(t *testing.T) {
in: CodeToVendor(VendorCodeLiteon),
wantSupported: true,
},
"delta code": {
in: CodeToVendor(VendorCodeDelta),
wantSupported: true,
},
"max sentinel code": {
in: CodeToVendor(VendorCodeMax),
wantSupported: false,
Expand Down Expand Up @@ -156,13 +173,17 @@ func TestVendorString(t *testing.T) {
in: CodeToVendor(VendorCodeLiteon),
want: VendorLiteon,
},
"delta string": {
in: CodeToVendor(VendorCodeDelta),
want: VendorDelta,
},
"unsupported string (Unsupported name)": {
in: CodeToVendor(VendorCodeUnsupported),
want: "unsupported vendor: Unsupported (0)",
},
"unsupported string (Max sentinel)": {
in: CodeToVendor(VendorCodeMax),
want: "unsupported vendor: Unsupported (2)",
want: "unsupported vendor: Unsupported (3)",
},
}

Expand All @@ -179,6 +200,7 @@ func TestRoundTrip_NameAndCode(t *testing.T) {
code VendorCode
}{
"round-trip Liteon": {code: VendorCodeLiteon},
"round-trip Delta": {code: VendorCodeDelta},
"round-trip Unsupported": {code: VendorCodeUnsupported},
"round-trip Max sentinel": {code: VendorCodeMax},
}
Expand All @@ -189,10 +211,13 @@ func TestRoundTrip_NameAndCode(t *testing.T) {
v := CodeToVendor(tc.code)
v2 := StringToVendor(v.Name)

// For Liteon, code should round-trip. For unsupported names, StringToVendor maps to Unsupported.
// For supported vendors, code should round-trip. For unsupported names, StringToVendor maps to Unsupported.
if tc.code == VendorCodeLiteon {
assert.Equal(t, VendorCodeLiteon, v2.Code)
assert.Equal(t, VendorLiteon, v2.Name)
} else if tc.code == VendorCodeDelta {
assert.Equal(t, VendorCodeDelta, v2.Code)
assert.Equal(t, VendorDelta, v2.Name)
} else {
assert.Equal(t, VendorCodeUnsupported, v2.Code)
assert.Equal(t, v.Name, v2.Name)
Expand Down
1 change: 1 addition & 0 deletions powershelf-manager/pkg/converter/protobuf/converter.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ func init() {
pmcTypeToMap = map[vendor.VendorCode]pb.PMCVendor{
vendor.VendorCodeUnsupported: pb.PMCVendor_PMC_TYPE_UNKNOWN,
vendor.VendorCodeLiteon: pb.PMCVendor_PMC_TYPE_LITEON,
vendor.VendorCodeDelta: pb.PMCVendor_PMC_TYPE_DELTA,
}

componentTypeFromMap = map[pb.PowershelfComponent]powershelf.Component{
Expand Down
8 changes: 8 additions & 0 deletions powershelf-manager/pkg/converter/protobuf/converter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ func TestPMCVendorFrom(t *testing.T) {
in: pb.PMCVendor_PMC_TYPE_LITEON,
expected: vendor.VendorCodeLiteon,
},
"delta -> delta": {
in: pb.PMCVendor_PMC_TYPE_DELTA,
expected: vendor.VendorCodeDelta,
},
"unmapped enum -> unsupported": {
in: pb.PMCVendor(999),
expected: vendor.VendorCodeUnsupported,
Expand Down Expand Up @@ -82,6 +86,10 @@ func TestVendorCodeTo(t *testing.T) {
in: vendor.VendorCodeLiteon,
expected: pb.PMCVendor_PMC_TYPE_LITEON,
},
"delta -> delta": {
in: vendor.VendorCodeDelta,
expected: pb.PMCVendor_PMC_TYPE_DELTA,
},
"unmapped code -> unknown": {
in: vendor.VendorCodeMax,
expected: pb.PMCVendor_PMC_TYPE_UNKNOWN,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,8 @@ func (ff *FirmwareFetcher) getPmcFirmwareEntries(v vendor.Vendor) ([]FirmwareEnt
}
}

return nil, fmt.Errorf("no firmware found for vendor %s out of vendors %v", v.Name, vendors)
log.Printf("no embedded firmware found for vendor %s; firmware operations will be unavailable for this vendor", v.Name)
return nil, nil
}

// open opens a file by embedded path.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ func New(store FirmwareUpdateStore, pmcManager *pmcmanager.PmcManager, dryRun bo

updater, err := newFirmwareUpdater(vendor)
if err != nil {
return nil, err
log.Printf("skipping firmware support for vendor %s: %v", vendor.Name, err)
continue
}

manager.firmwareUpdater[vendor] = updater
Expand Down
10 changes: 10 additions & 0 deletions powershelf-manager/pkg/firmwaremanager/firmware_repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@ type FirmwareRepo struct {
// summary returns a human-readable report of supported versions and artifacts.
func (repo *FirmwareRepo) summary() (string, error) {
sb := strings.Builder{}

if len(repo.upgrades) == 0 {
sb.WriteString("Firmware Repo has no firmware artifacts available\n")
return sb.String(), nil
}

sb.WriteString(fmt.Sprintf("Firmware Repo supports upgrading powershelves starting at PMC fw version between %s to %s (inclusive)\n", repo.minStartingFwVersion.String(), repo.maxStartingFwVersion.String()))

for i, upgrade := range repo.upgrades {
Expand Down Expand Up @@ -75,6 +81,10 @@ func newFirmwareRepo(v vendor.Vendor) (*FirmwareRepo, error) {
return nil, err
}

if fw_entries == nil {
return &FirmwareRepo{ff: ff}, nil
}

var upgrades []FirmwareUpgrade = make([]FirmwareUpgrade, 0, len(fw_entries))
var minStartingFwVersion firmwareVersion
var maxStartingFwVersion firmwareVersion
Expand Down
4 changes: 4 additions & 0 deletions powershelf-manager/pkg/firmwaremanager/firmware_updater.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ func newFirmwareUpdater(v vendor.Vendor) (*FirmwareUpdater, error) {
return nil, err
}

if len(repo.upgrades) == 0 {
log.Printf("no firmware artifacts available for vendor %s; firmware operations will be unavailable", v.Name)
}

rule, err := newUpgradeRule(v)
if err != nil {
return nil, err
Expand Down
Loading
Loading