The common patch design doesn't really work across branches very well.
This patch makes it so the common patches are specified in the same
file, but on a per branch basis. Making it easier to manage common
patches per branch.
Also, includes a fix and adds test coverage to the prep_image method
where we were referencing 'undercloud_admin_ip' before assignment in a
case where we were not using ODL and had patches to overcloud.
Change-Id: I7672947afd826fdc0042361a0139e22d6d5dd864
Signed-off-by: Tim Rozet <trozet@redhat.com>
         common_patches = utils.parse_yaml(self.p_file)
         logging.debug('Content from common patch file is: {}'.format(
             pprint.pformat(common_patches)))
-        if 'patches' not in common_patches.keys():
-            logging.error('Error parsing common patches file, wrong format. '
-                          'Missing "patches" dictionary')
+        os_version = self.ds['deploy_options']['os_version']
+        try:
+            common_patches = common_patches['patches'][os_version]
+        except KeyError:
+            logging.error('Error parsing common patches file, wrong format.')
             raise ApexDeployException('Invalid format of common patch file')
-        else:
-            common_patches = common_patches['patches']
+
         for ptype in ('undercloud', 'overcloud'):
             if ptype in common_patches:
                 patches[ptype] = utils.unique(patches[ptype] +
 
                                    "/root/nosdn_vpp_rpms/*.rpm"}
             ])
 
+    undercloud_admin_ip = ns['networks'][con.ADMIN_NETWORK][
+        'installer_vm']['ip']
     if sdn == 'opendaylight':
-        undercloud_admin_ip = ns['networks'][con.ADMIN_NETWORK][
-            'installer_vm']['ip']
         oc_builder.inject_opendaylight(
             odl_version=ds_opts['odl_version'],
             image=tmp_oc_image,
 
 ---
 patches:
-  undercloud:
-    - change-id: I2e0a40d7902f592e4b7bd727f57048111e0bea36
-      project: openstack/tripleo-common
+  queens:
+    undercloud:
+      - change-id: I2e0a40d7902f592e4b7bd727f57048111e0bea36
+        project: openstack/tripleo-common
 
         mock_c_builder.add_upstream_patches.assert_called()
         self.assertListEqual(sorted(rv), ['nova-api', 'opendaylight'])
 
+    @patch('apex.overcloud.deploy.c_builder')
+    @patch('apex.overcloud.deploy.oc_builder')
+    @patch('apex.overcloud.deploy.virt_utils')
+    @patch('apex.overcloud.deploy.shutil')
+    @patch('apex.overcloud.deploy.os.path')
+    @patch('builtins.open', mock_open())
+    def test_prep_image_nosdn_upstream_containers_patches(
+            self, mock_os_path, mock_shutil, mock_virt_utils,
+            mock_oc_builder, mock_c_builder):
+        ds_opts = {'dataplane': 'ovs',
+                   'sdn_controller': False,
+                   'odl_version': con.DEFAULT_ODL_VERSION,
+                   'odl_vpp_netvirt': False}
+        ds = {'deploy_options': MagicMock(),
+              'global_params': MagicMock()}
+        ds['deploy_options'].__getitem__.side_effect = \
+            lambda i: ds_opts.get(i, MagicMock())
+        ds['deploy_options'].__contains__.side_effect = \
+            lambda i: True if i in ds_opts else MagicMock()
+        ns = MagicMock()
+        mock_c_builder.add_upstream_patches.return_value = ['nova-api']
+        patches = ['dummy_nova_patch']
+        rv = prep_image(ds, ns, 'undercloud.qcow2', '/tmp', root_pw='test',
+                        docker_tag='latest', patches=patches)
+        mock_virt_utils.virt_customize.assert_called()
+        mock_c_builder.add_upstream_patches.assert_called()
+        self.assertListEqual(sorted(rv), ['nova-api'])
+
     @patch('apex.overcloud.deploy.oc_builder')
     @patch('apex.overcloud.deploy.virt_utils')
     @patch('apex.overcloud.deploy.shutil')
 
 ---
 patches:
-  undercloud:
-    - change-id: I2e0a40d7902f592e4b7bd727f57048111e0bea36
-      project: openstack/tripleo-common
-    - change-id: Iaa2276aadae351fbc138de258c51d786f69e4395
-      project: openstack/tripleo-common
-      branch: master
+  master:
+    undercloud:
+      - change-id: I2e0a40d7902f592e4b7bd727f57048111e0bea36
+        project: openstack/tripleo-common
+      - change-id: Iaa2276aadae351fbc138de258c51d786f69e4395
+        project: openstack/tripleo-common
+    overcloud:
+      - change-id: Ie988ba6a2d444a614e97c0edf5fce24b23970310
+        project: openstack/puppet-tripleo
+      - change-id: I93e3d355625508fdc42f44bdd358f3ba86fbd8d7
+        project: openstack/puppet-tripleo
+  queens:
+    undercloud:
+      - change-id: I966bf7f6f8d1cbc656abfad59e8bb927e1aa53c2
+        project: openstack/tripleo-common
+    overcloud:
+      - change-id: Ie988ba6a2d444a614e97c0edf5fce24b23970310
+        project: openstack/puppet-tripleo
+      - change-id: I93e3d355625508fdc42f44bdd358f3ba86fbd8d7
+        project: openstack/puppet-tripleo
 
 ---
 global_params:
   ha_enabled: true
+
 deploy_options:
   containers: true
   os_version: master
 
 ---
 global_params:
   ha_enabled: false
+
 deploy_options:
   containers: true
   os_version: master
 
 ---
 global_params:
   ha_enabled: true
-  patches:
-    undercloud:
-      - change-id: I2e0a40d7902f592e4b7bd727f57048111e0bea36
-        project: openstack/tripleo-common
+
 deploy_options:
   containers: true
   os_version: master
 
 ---
 global_params:
   ha_enabled: false
-  patches:
-    undercloud:
-      - change-id: I2e0a40d7902f592e4b7bd727f57048111e0bea36
-        project: openstack/tripleo-common
+
 deploy_options:
   containers: true
   os_version: master
 
 ---
 global_params:
   ha_enabled: true
-  patches:
-    overcloud:
-      - change-id: Ie988ba6a2d444a614e97c0edf5fce24b23970310
-        project: openstack/puppet-tripleo
-        branch: master
+
 deploy_options:
   containers: true
   os_version: master
 
 ---
 global_params:
   ha_enabled: false
-  patches:
-    overcloud:
-      - change-id: Ie988ba6a2d444a614e97c0edf5fce24b23970310
-        project: openstack/puppet-tripleo
-        branch: master
+
 deploy_options:
   containers: true
   os_version: master
 
 ---
 global_params:
   ha_enabled: true
-  patches:
-    overcloud:
-      - change-id: Ie988ba6a2d444a614e97c0edf5fce24b23970310
-        project: openstack/puppet-tripleo
-        branch: stable/queens
+
 deploy_options:
   containers: true
   os_version: queens
 
 ---
 global_params:
   ha_enabled: false
-  patches:
-    overcloud:
-      - change-id: Ie988ba6a2d444a614e97c0edf5fce24b23970310
-        project: openstack/puppet-tripleo
-        branch: stable/queens
+
 deploy_options:
   containers: true
   os_version: queens