From 70f1949c4be5f5a0f3260b8509ab008ade88a294 Mon Sep 17 00:00:00 2001
From: nhertz <nhertz@nrao.edu>
Date: Fri, 14 Aug 2020 16:07:40 -0600
Subject: [PATCH] Completed recipe for building packages and transferring them
 to builder.

---
 buildout.cfg                           |  6 ++--
 recipes/build_pkgs/build_pkgs.py       | 28 ++++------------
 recipes/setup_to_meta/setup_to_meta.py |  2 +-
 tools/transfer_to_builder.py           | 46 ++++++++++++++++++++++++++
 4 files changed, 57 insertions(+), 25 deletions(-)

diff --git a/buildout.cfg b/buildout.cfg
index 67ba7fcb7..dbd0f230c 100644
--- a/buildout.cfg
+++ b/buildout.cfg
@@ -1,6 +1,6 @@
 # Main section
 # Accessible from the command line using 'buildout key=value'
-# e.g. buildout parts=build_packages will specify build_packages
+# e.g. buildout parts=build_pkgs will specify build_pkgs
 # as a part that should be installed
 [buildout]
 develop = recipes/setup_to_meta recipes/build_pkgs
@@ -9,8 +9,8 @@ develop = recipes/setup_to_meta recipes/build_pkgs
 # Depends on gen_metadata
 # Depends on `name` in [buildout] to specify which package to install
 # Specify name via command line using
-# `buildout parts=build_packages name={name}`
-[build_packages]
+# `buildout parts=build_pkgs name={name}`
+[build_pkgs]
 => gen_metadata
 recipe = build_pkgs
 name = ${buildout:name}
diff --git a/recipes/build_pkgs/build_pkgs.py b/recipes/build_pkgs/build_pkgs.py
index bf116452b..984203d7d 100644
--- a/recipes/build_pkgs/build_pkgs.py
+++ b/recipes/build_pkgs/build_pkgs.py
@@ -1,32 +1,17 @@
-import subprocess
+import subprocess, os, glob
 
 def get_pkg_list():
     """
     Run a couple shell commands to parse the metadata directory for its packages.
     :return: List of packages in metadata directory
     """
-    find_proc = subprocess.Popen(["find", "metadata",
+    find_proc = subprocess.run(["find", "metadata",
                                   "-name", "meta.yaml"],
                                  stdout=subprocess.PIPE)
-    return subprocess.check_output(["sed", "-e", "s:metadata/::",
-                                    "-e", "s:/meta.yaml::"],
-                                   stdin=find_proc.stdout).decode('utf-8').split('\n')
+    paths = find_proc.stdout.decode('utf-8')
+    fmt_paths = paths.replace("metadata/", "").replace("/meta.yaml", "")
+    return fmt_paths.split('\n')
 
-def transfer_packages():
-    """
-    Use shell commands to transfer build archives to builder and update its conda package index.
-    """
-    builder_addr = "builder.aoc.nrao.edu"
-    builder_path = "/home/builder.aoc.nrao.edu/content/conda/noarch"
-    subprocess.run(["ls", "pkgs/noarch/*.tar.bz2"])
-    subprocess.run(["scp", "pkgs/noarch/*.tar.bz2", builder_addr + ':' + builder_path])
-    cmd_cd = "cd {}".format(builder_path)
-    cmd_index = "conda index .."
-    cmd_chmod = "chmod -f 664 *"
-    subprocess.run(["ssh", builder_addr,
-                    cmd_cd + " && " +
-                    cmd_index + " && " +
-                    cmd_chmod])
 
 class Recipe:
     def __init__(self, buildout, name, options):
@@ -57,7 +42,8 @@ class Recipe:
             subprocess.run(["conda", "build", "metadata/{}".format(p), "--output-folder", "pkgs/"],
                            stdout=subprocess.PIPE)
         self.options.created("pkgs/")
-        transfer_packages()
+
+        subprocess.run(["python3", "tools/transfer_to_builder.py"])
 
         return self.options.created()
 
diff --git a/recipes/setup_to_meta/setup_to_meta.py b/recipes/setup_to_meta/setup_to_meta.py
index af65485ab..c011e624d 100644
--- a/recipes/setup_to_meta/setup_to_meta.py
+++ b/recipes/setup_to_meta/setup_to_meta.py
@@ -147,7 +147,7 @@ def get_dirs():
     :return: List of directories as strings.
     """
     find = subprocess.run([
-        'find', '.', '-name', 'setup.py', '-not', '-path', './src/*'
+        'find', '.', '-name', 'setup.py', '-not', '-path', './recipes/*'
     ], stdout=subprocess.PIPE)
     dirs = find.stdout.decode('utf-8').split('\n')
     dirs_cpy = dirs
diff --git a/tools/transfer_to_builder.py b/tools/transfer_to_builder.py
index e69de29bb..085e81807 100644
--- a/tools/transfer_to_builder.py
+++ b/tools/transfer_to_builder.py
@@ -0,0 +1,46 @@
+import subprocess, paramiko, fnmatch, os
+from scp import SCPClient
+
+def get_build_pkg_names():
+    """
+    Search through pkgs directory for built .tar.bz2 packages
+    :return: List of package archive file names
+    """
+    pkg_names = []
+    d = "pkgs/noarch/"
+    for file in os.listdir(d):
+        if fnmatch.fnmatch(file, "*.tar.bz2"):
+            pkg_names.append(d + file)
+
+    return pkg_names
+
+def create_ssh_client(server):
+    client = paramiko.SSHClient()
+    client.load_system_host_keys()
+    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+    client.connect(server)
+    return client
+
+def transfer_packages(pkg_names):
+    """
+    Use shell commands to transfer build archives to builder and update its conda package index.
+    """
+    builder_addr = "builder.aoc.nrao.edu"
+    builder_path = "/home/builder.aoc.nrao.edu/content/conda/noarch"
+    ssh = create_ssh_client(builder_addr)
+    scp = SCPClient(ssh.get_transport())
+    if len(pkg_names):
+        scp.put(' '.join(pkg_names), builder_path)
+        cmd_cd = "cd {}".format(builder_path)
+        cmd_index = "conda index .."
+        cmd_chmod = "chmod -f 664 *"
+        subprocess.run(["ssh", builder_addr,
+                        cmd_cd + " && " +
+                        cmd_index + " && " +
+                        cmd_chmod])
+    else:
+        print("No packages found in pkgs/noarch. Did conda build successfully build the package(s)?")
+        return
+
+if __name__ == "__main__":
+    transfer_packages(get_build_pkg_names())
\ No newline at end of file
-- 
GitLab