From b077ed028bcb8b3c08447484a3870e2863be3b21 Mon Sep 17 00:00:00 2001 From: Jeffrey Townsend Date: Thu, 20 Oct 2016 21:18:24 +0000 Subject: [PATCH] Enable ONIE and Firmware Upgrade Package Support --- .../src/boot.d/61.upgrade-firmware | 3 ++ .../src/etc/onl/sysconfig/00-defaults.yml | 6 +++ .../src/python/onl/upgrade/firmware.py | 52 +++++++++++++++++++ .../src/python/onl/upgrade/onie.py | 33 +++--------- .../src/python/onl/upgrade/ubase.py | 22 +++++--- 5 files changed, 84 insertions(+), 32 deletions(-) create mode 100755 packages/base/all/vendor-config-onl/src/boot.d/61.upgrade-firmware create mode 100755 packages/base/all/vendor-config-onl/src/python/onl/upgrade/firmware.py diff --git a/packages/base/all/vendor-config-onl/src/boot.d/61.upgrade-firmware b/packages/base/all/vendor-config-onl/src/boot.d/61.upgrade-firmware new file mode 100755 index 00000000..aa23c80c --- /dev/null +++ b/packages/base/all/vendor-config-onl/src/boot.d/61.upgrade-firmware @@ -0,0 +1,3 @@ +#!/usr/bin/python +from onl.upgrade.firmware import FirmwareUpgrade +FirmwareUpgrade().main() diff --git a/packages/base/all/vendor-config-onl/src/etc/onl/sysconfig/00-defaults.yml b/packages/base/all/vendor-config-onl/src/etc/onl/sysconfig/00-defaults.yml index de61b257..a9519949 100644 --- a/packages/base/all/vendor-config-onl/src/etc/onl/sysconfig/00-defaults.yml +++ b/packages/base/all/vendor-config-onl/src/etc/onl/sysconfig/00-defaults.yml @@ -25,6 +25,11 @@ upgrade: system: auto: advisory + firmware: + auto: advisory + package: + dir: /lib/platform-config/current/onl/upgrade/firmware + loader: auto: advisory versions: /etc/onl/loader/versions.json @@ -39,6 +44,7 @@ upgrade: swi: auto: disabled + pki: key: name: key.pem diff --git a/packages/base/all/vendor-config-onl/src/python/onl/upgrade/firmware.py b/packages/base/all/vendor-config-onl/src/python/onl/upgrade/firmware.py new file mode 100755 index 00000000..e9a08088 --- /dev/null +++ b/packages/base/all/vendor-config-onl/src/python/onl/upgrade/firmware.py @@ -0,0 +1,52 @@ +#!/usr/bin/python -u + +import os +import sys + +from onl.upgrade import ubase +from onl.sysconfig import sysconfig + +class FirmwareUpgrade(ubase.BaseOnieUpgrade): + + name="firmware" + Name="Firmware" + title="Firmware Upgrade Check" + atype="A firmware" + + current_version_key="Current Firmware Version" + next_version_key="Next Firmware Version" + + def init_versions(self): + + # Get the current platform firmware version + self.current_version = self.platform.firmware_version() + self.next_version = None + self.updater = None + self.load_manifest(os.path.join(sysconfig.upgrade.firmware.package.dir, "manifest.json")) + + def do_upgrade(self, forced=False): + self.install_onie_updater(sysconfig.upgrade.firmware.package.dir, + self.manifest['updater']) + self.initiate_onie_update() + + + def upgrade_notes(self): + notes = """ + * Two reboots will be required to complete this upgrade. + + * Do not turn the power off on this device until the upgrade is complete. + Disrupting power during the firmware upgrade may result in an unrecoverable system.""" + + duration = self.manifest.get("duration", None) + if duration: + notes = notes + """ + + * THIS UPGRADE WILL REQUIRE APPROXIMATELY %s MINUTES. + The system will reboot when completed.""" % duration + + return notes + + + def do_no_upgrade(self): + self.clean_onie_updater() + diff --git a/packages/base/all/vendor-config-onl/src/python/onl/upgrade/onie.py b/packages/base/all/vendor-config-onl/src/python/onl/upgrade/onie.py index a4f6beb2..fab08c0d 100755 --- a/packages/base/all/vendor-config-onl/src/python/onl/upgrade/onie.py +++ b/packages/base/all/vendor-config-onl/src/python/onl/upgrade/onie.py @@ -5,7 +5,6 @@ import sys from onl.upgrade import ubase from onl.sysconfig import sysconfig -from onl.mounts import OnlMountManager, OnlMountContextReadOnly, OnlMountContextReadWrite class OnieUpgrade(ubase.BaseOnieUpgrade): @@ -23,37 +22,19 @@ class OnieUpgrade(ubase.BaseOnieUpgrade): self.current_version = self.platform.onie_version() self.next_version = None self.updater = None + self.load_manifest(os.path.join(sysconfig.upgrade.onie.package.dir, "manifest.json")) - self.manifest = self.load_json(os.path.join(sysconfig.upgrade.onie.package.dir, "manifest.json")) + def do_upgrade(self, forced=False): + self.install_onie_updater(sysconfig.upgrade.onie.package.dir, + self.manifest['updater']) + self.initiate_onie_update() - if self.manifest is None: - self.finish("No ONIE updater available for the current platform.") - - if 'onie-version' not in self.manifest: - self.finish("No ONIE version in the upgrade manifest.") - else: - self.next_version = self.manifest['onie-version'] - - if 'onie-updater' not in self.manifest: - self.finish("No ONIE updater in the upgrade manifest.") - - - def summarize(self): - self.logger.info("Current ONIE Version: %s" % self.current_version) - self.logger.info(" Next ONIE Version: %s" % self.manifest.get('onie-version')) - self.logger.info(" Updater: %s" % self.manifest.get('onie-updater')) - self.logger.info("") + def do_no_upgrade(self): + self.clean_onie_updater() def upgrade_notes(self): return """ * The system will reboot into ONIE to complete the update, and then reboot to return to Switch Light """ - def do_upgrade(self, forced=False): - self.install_onie_updater(sysconfig.upgrade.onie.package.dir, - self.manifest['onie-updater']) - self.initiate_onie_update() - - def do_no_upgrade(self): - self.clean_onie_updater() diff --git a/packages/base/all/vendor-config-onl/src/python/onl/upgrade/ubase.py b/packages/base/all/vendor-config-onl/src/python/onl/upgrade/ubase.py index af2b677d..2b5f6c22 100644 --- a/packages/base/all/vendor-config-onl/src/python/onl/upgrade/ubase.py +++ b/packages/base/all/vendor-config-onl/src/python/onl/upgrade/ubase.py @@ -411,11 +411,21 @@ class BaseOnieUpgrade(BaseUpgrade): self.logger.info("Removing previous onie-updater.") os.remove(updater) + def load_manifest(self, path): + self.manifest = self.load_json(path) -# def upgrade_status(): -# data = {} -# if os.path.exists(BaseUpgrade.UPGRADE_STATUS_JSON): -# with open(BaseUpgrade.UPGRADE_STATUS_JSON) as f: -# data = json.load(f) -# return data + if self.manifest is None: + self.finish("No %s updater available for the current platform." % self.Name) + if 'version' not in self.manifest: + self.finish("No %s version in the upgrade manifest." % self.Name) + else: + self.next_version = self.manifest['version'] + + if 'updater' not in self.manifest: + self.finish("No %s updater in the upgrade manifest." % self.Name) + + def summarize(self): + self.logger.info("Current %s Version: %s" % (self.Name, self.current_version)) + self.logger.info(" Next %s Version: %s" % (self.Name, self.manifest.get('version'))) + self.logger.info("")