Enable ONIE and Firmware Upgrade Package Support

This commit is contained in:
Jeffrey Townsend
2016-10-20 21:18:24 +00:00
committed by Carl D. Roth
parent 4a5732241c
commit b077ed028b
5 changed files with 84 additions and 32 deletions

View File

@@ -0,0 +1,3 @@
#!/usr/bin/python
from onl.upgrade.firmware import FirmwareUpgrade
FirmwareUpgrade().main()

View File

@@ -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

View File

@@ -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()

View File

@@ -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()

View File

@@ -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("")