docs: def _add_services(self, this_service, other_services, use_source=None,
                        no_origin=None):
          """Add services to the deployment and optionally set
          openstack-origin/source.
  
          :param this_service dict: Service dictionary describing the service
                                    whose amulet tests are being run
          :param other_services dict: List of service dictionaries describing
                                      the services needed to support the target
                                      service
          :param use_source list: List of services which use the 'source' config
                                  option rather than 'openstack-origin'
          :param no_origin list: List of services which do not support setting
                                 the Cloud Archive.
          Service Dict:
              {
                  'name': str charm-name,
                  'units': int number of units,
                  'constraints': dict of juju constraints,
                  'location': str location of charm,
              }
          eg
          this_service = {
              'name': 'openvswitch-odl',
              'constraints': {'mem': '8G'},
          }
          other_services = [
              {
                  'name': 'nova-compute',
                  'units': 2,
                  'constraints': {'mem': '4G'},
                  'location': cs:~bob/xenial/nova-compute
              },
              {
                  'name': 'mysql',
                  'constraints': {'mem': '2G'},
              },
              {'neutron-api-odl'}]
          use_source = ['mysql']
          no_origin = ['neutron-api-odl']
          """
          self.log.info('OpenStackAmuletDeployment:  adding services')
  
          other_services = self._determine_branch_locations(other_services)
  
          super(OpenStackAmuletDeployment, self)._add_services(this_service,
                                                               other_services)
  
          services = other_services
          services.append(this_service)
  
          use_source = use_source or []
          no_origin = no_origin or []
  
          # Charms which should use the source config option
          use_source = list(set(
              use_source + ['mysql', 'mongodb', 'rabbitmq-server', 'ceph',
                            'ceph-osd', 'ceph-radosgw', 'ceph-mon',
                            'ceph-proxy', 'percona-cluster', 'lxd']))
  
          # Charms which can not use openstack-origin, ie. many subordinates
          no_origin = list(set(
              no_origin + ['cinder-ceph', 'hacluster', 'neutron-openvswitch',
                           'nrpe', 'openvswitch-odl', 'neutron-api-odl',
                           'odl-controller', 'cinder-backup', 'nexentaedge-data',
                           'nexentaedge-iscsi-gw', 'nexentaedge-swift-gw',
                           'cinder-nexentaedge', 'nexentaedge-mgmt',
                           'ceilometer-agent']))
  
          if self.openstack:
              for svc in services:
                  if svc['name'] not in use_source + no_origin:
                      config = {'openstack-origin': self.openstack}
                      self.d.configure(svc['name'], config)
  
          if self.source:
              for svc in services:
                  if svc['name'] in use_source and svc['name'] not in no_origin:
                      config = {'source': self.source}
                      self.d.configure(svc['name'], config)