def _create_build_config_and_build(self, build_request, namespace): # TODO: test this method more thoroughly build_json = build_request.render() apiVersion = build_json['apiVersion'] if apiVersion != self.os_conf.get_openshift_api_version(): raise OsbsValidationException("BuildConfig template has incorrect apiVersion (%s)" % apiVersion) build_config_name = build_json['metadata']['name'] # check if a build already exists for this config; if so then raise running_builds = self._get_running_builds_for_build_config(build_config_name, namespace) rb_len = len(running_builds) if rb_len > 0: if rb_len == 1: rb = running_builds[0] msg = 'Build %s for %s in state %s, can\'t proceed.' % \ (rb.get_build_name(), build_config_name, rb.status) else: msg = self._panic_msg_for_more_running_builds(build_config_name, running_builds) raise OsbsException(msg) existing_bc = None try: # see if there's already a build config existing_bc = self.os.get_build_config(build_config_name) except OsbsException: pass # doesn't exist => do nothing build = None if existing_bc is not None: utils.deep_update(existing_bc, build_json) logger.debug('build config for %s already exists, updating...', build_config_name) self.os.update_build_config(build_config_name, json.dumps(existing_bc), namespace) else: # if it doesn't exist, then create it logger.debug('build config for %s doesn\'t exist, creating...', build_config_name) self.os.create_build_config(json.dumps(build_json), namespace=namespace) # if there's an "ImageChangeTrigger" on the BuildConfig and "From" is of type # "ImageStreamTag", the build will be scheduled automatically # see https://github.com/projectatomic/osbs-client/issues/205 if build_request.is_auto_instantiated(): builds = self._poll_for_builds_from_buildconfig(build_config_name, namespace) if len(builds) > 0: if len(builds) > 1: raise OsbsException( self._panic_msg_for_more_running_builds(build_config_name, builds)) else: build = builds[0].request if build is None: build = self.os.start_build(build_config_name, namespace=namespace) return build
def test_deep_update(): x = {'a': 'A', 'b': {'b1': 'B1', 'b2': 'B2'}} y = {'b': {'b1': 'newB1', 'b3': 'B3'}, 'c': 'C'} deep_update(x, y) assert x == {'a': 'A', 'b': {'b1': 'newB1', 'b2': 'B2', 'b3': 'B3'}, 'c': 'C'}