From d77049a98658cdebe41bcc230ef9684e5889baf8 Mon Sep 17 00:00:00 2001 From: Jonathan Maw Date: Thu, 14 Mar 2013 12:58:12 +0000 Subject: Add copy-artifacts-plugin.py --- morphlib/plugins/copy-artifacts_plugin.py | 102 ++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 morphlib/plugins/copy-artifacts_plugin.py (limited to 'morphlib') diff --git a/morphlib/plugins/copy-artifacts_plugin.py b/morphlib/plugins/copy-artifacts_plugin.py new file mode 100644 index 00000000..e47a9c7d --- /dev/null +++ b/morphlib/plugins/copy-artifacts_plugin.py @@ -0,0 +1,102 @@ +# Copyright (C) 2013 Codethink Limited +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + + +import os +import glob +import json + + +import cliapp + + + +import morphlib + + + +class CopyArtifactsPlugin(cliapp.Plugin): + + def enable(self): + self.app.add_subcommand( + 'list-artifacts', self.list_artifacts, + arg_synopsis='SYSTEM') + self.app.add_subcommand( + 'copy-artifacts', self.copy_artifacts, + arg_synopsis='SYSTEM DESTINATION') + + def disable(self): + pass + + def list_artifacts(self, args): + '''List every artifact that makes up a system''' + + if len(args) != 1: + raise cliapp.AppException( + 'Wrong number of arguments to list-artifacts command' + '(see help)') + + system = args[0] + artifacts = self.find_artifacts(system) + for artifact in artifacts: + self.app.output.write(artifact + "\n") + + def copy_artifacts(self, args): + '''Copy every artifact that makes up a system to an rsync path''' + + if len(args) != 2: + raise cliapp.AppException( + 'Wrong number of arguments to copy-artifacts command' + '(see help)') + + system = args[0] + rsync_dest = args[1] + artifacts = self.find_artifacts(system) + cmdline = ['rsync'] + cmdline.extend(artifacts) + cmdline.append(rsync_dest) + cliapp.runcmd(cmdline) + + def find_artifacts(self, system): + artifacts_dir = os.path.join(self.app.settings['cachedir'], 'artifacts') + artifacts = [] + + def find_in_system(dirname): + metadirs = [ + os.path.join(dirname, 'factory', 'baserock'), + os.path.join(dirname, 'baserock') + ] + existing_metadirs = [x for x in metadirs if os.path.isdir(x)] + if not existing_metadirs: + raise NotASystemArtifactError(system) + metadir = existing_metadirs[0] + for basename in glob.glob(os.path.join(metadir, '*.meta')): + metafile = os.path.join(metadir, basename) + metadata = json.load(open(metafile)) + cache_key = metadata['cache-key'] + artifact_glob = os.path.join(artifacts_dir, cache_key) + '*' + found_artifacts = glob.glob(artifact_glob) + if not found_artifacts: + raise cliapp.AppException('Could not find cache-key ' + + cache_key + 'for artifact ' + + metajson['artifact-name']) + artifacts.extend(found_artifacts) + + morphlib.bins.call_in_artifact_directory( + self.app, system, find_in_system) + + return artifacts + -- cgit v1.2.1 From 6e8f9eae1b8f57b8f97afd4b65b7571f490670d6 Mon Sep 17 00:00:00 2001 From: Jonathan Maw Date: Thu, 14 Mar 2013 14:38:11 +0000 Subject: Acknowledge the lack of test coverage --- morphlib/plugins/copy-artifacts_plugin.py | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'morphlib') diff --git a/morphlib/plugins/copy-artifacts_plugin.py b/morphlib/plugins/copy-artifacts_plugin.py index e47a9c7d..9cf8c147 100644 --- a/morphlib/plugins/copy-artifacts_plugin.py +++ b/morphlib/plugins/copy-artifacts_plugin.py @@ -15,6 +15,10 @@ +# FIXME: no tests + + + import os import glob import json -- cgit v1.2.1