def test_make_name_from_git(repo, branch, limit, separator, expected, hash_size=5): bc_name = make_name_from_git(repo, branch, limit + len(separator) + hash_size, separator, hash_size=hash_size) assert expected == bc_name[:-(hash_size + len(separator))] # Is this a valid name for OpenShift to use? valid = re.compile(BC_NAME_REGEX) assert valid.match(bc_name)
def test_make_name_from_git_all_from_file(): all_sha = set() with open(SHA_INPUT_FILE) as f: lines = f.read().splitlines() for line in lines: repo, branch = line.split() bc_name = make_name_from_git(repo, branch, 30, '-') all_sha.add(bc_name) # Is this a valid name for OpenShift to use? valid = re.compile(BC_NAME_REGEX) assert valid.match(bc_name) assert len(lines) == len(all_sha)
def test_make_name_from_git(repo, branch, limit, separator, expected, hash_size=5): flexmock( osbs.utils).should_receive('generate_random_postfix').and_return('') bc_name = make_name_from_git(repo, branch, limit + len(separator) + hash_size, separator, hash_size=hash_size) assert expected == bc_name[:-(hash_size + len(separator))] # Is this a valid name for OpenShift to use? valid = re.compile(BC_NAME_REGEX) assert valid.match(bc_name)
def make_params(cls, additional_tags=None, base_image=None, build_conf=None, compose_ids=None, dependency_replacements=None, filesystem_koji_task_id=None, flatpak=None, git_branch=None, git_commit_depth=None, git_ref=None, git_uri=None, include_koji_repo=None, isolated=None, koji_parent_build=None, koji_upload_dir=None, name_label=None, operator_bundle_replacement_pullspecs=None, operator_csv_modifications_url=None, operator_manifests_extract_platform=None, parent_images_digests=None, platform=None, platforms=None, release=None, remote_sources=None, repo_info=None, tags_from_yaml=None, yum_repourls=None, **kwargs): """ Create a BuildUserParams instance. Like the parent method, most params are simply used as values for the corresponding BuildParam, this time with two notable exceptions: `build_conf` and `repo_info`. Compared to the parent method, this one pulls even more param values from `build_conf` and may also pull some values from `repo_info` (see below). these parameters are accepted: :param build_conf: BuildConfiguration, optional build configuration :param compose_ids: list of int, ODCS composes to use instead of generating new ones :param dependency_replacements: list of str, dependencies to be replaced by cachito, as pkg_manager:name:version[:new_name] :param filesystem_koji_task_id: int, Koji Task that created the base filesystem :param flatpak: if we should build a Flatpak OCI Image :param git_branch: str, branch name of the branch to be pulled :param git_ref: str, commit ID of the branch to be pulled :param git_uri: str, uri of the git repository for the source :param include_koji_repo: include the repo from the target build tag, even if other repourls are provided. :param isolated: bool, build as an isolated build :param koji_parent_build: str, :param koji_upload_dir: str, koji directory where the completed image will be uploaded :param name_label: str, label of the parent image :param user: str, name of the user requesting the build :param operator_bundle_replacement_pullspecs: dict, mapping of original pullspecs to replacement pullspecs for operator manifest bundle builds :param operator_csv_modifications_url: str, URL to JSON file describing operator CSV changes :param operator_manifests_extract_platform: str, indicates which platform should upload operator manifests to koji :param parent_images_digests: dict, mapping image digests to names and platforms :param platforms: list of str, platforms to build on :param platform: str, platform :param reactor_config_map: str, name of the config map containing the reactor environment :param release: str, :param remote_sources: list of dicts, each dict contains info about particular remote source with the following keys: build_args: dict, extra args for `builder.build_args`, if any configs: list of str, configuration files to be injected into the exploded remote sources dir request_id: int, cachito request id; used to request the Image Content Manifest url: str, URL from which to download a source archive name: str, name of remote source :param repo_info: RepoInfo, git repo data for the build :param scratch: bool, build as a scratch build :param signing_intent: bool, True to sign the resulting image :param yum_repourls: list of str, uris of the yum repos to pull from Please keep the paramater list alphabetized for easier tracking of changes the following parameters are pulled from the BuildConfiguration (ie, build_conf) the following parameters can be pulled from the RepoInfo (ie, repo_info) :param git_branch: str, branch name of the branch to be pulled :param git_ref: str, commit ID of the branch to be pulled :param git_uri: str, uri of the git repository for the source """ if repo_info: additional_tags = repo_info.additional_tags.tags git_branch = repo_info.git_branch git_commit_depth = repo_info.git_commit_depth git_ref = repo_info.git_ref git_uri = repo_info.git_uri tags_from_yaml = repo_info.additional_tags.from_container_yaml elif not git_uri: raise OsbsValidationException( 'no repo_info passed to BuildUserParams') # For flatpaks, we can set this later from the reactor config if not base_image and not flatpak: raise OsbsValidationException("base_image must be provided") if not name_label: raise OsbsValidationException("name_label must be provided") if kwargs.get('signing_intent') and compose_ids: raise OsbsValidationException( 'Please only define signing_intent -OR- compose_ids, not both') if not (compose_ids is None or isinstance(compose_ids, list)): raise OsbsValidationException("compose_ids must be a list") if not (dependency_replacements is None or isinstance(dependency_replacements, list)): raise OsbsValidationException( "dependency_replacements must be a list") if not (yum_repourls is None or isinstance(yum_repourls, list)): raise OsbsValidationException("yum_repourls must be a list") kwargs.update({ "base_image": base_image, "build_conf": build_conf, "compose_ids": compose_ids or [], "dependency_replacements": dependency_replacements or [], "filesystem_koji_task_id": filesystem_koji_task_id, "flatpak": flatpak, "include_koji_repo": include_koji_repo, "isolated": isolated, "koji_parent_build": koji_parent_build, "koji_upload_dir": koji_upload_dir, "operator_bundle_replacement_pullspecs": operator_bundle_replacement_pullspecs, "operator_csv_modifications_url": operator_csv_modifications_url, "operator_manifests_extract_platform": operator_manifests_extract_platform, "parent_images_digests": parent_images_digests, "platform": platform, "platforms": platforms, "release": release, "remote_sources": remote_sources, "yum_repourls": yum_repourls or [], # Potentially pulled from repo_info "additional_tags": additional_tags or set(), "git_branch": git_branch, "git_commit_depth": git_commit_depth, "git_ref": git_ref, "git_uri": git_uri, "name": make_name_from_git(git_uri, git_branch), "tags_from_yaml": tags_from_yaml, }) params = cls._make_params_super(**kwargs) if (params.scratch, params.isolated).count(True) > 1: raise OsbsValidationException( 'Build variations are mutually exclusive. ' 'Must set either scratch, isolated, or none. ') return params
def set_params( self, git_uri=None, git_ref=None, registry_uri=None, # compatibility name for registry_uris registry_uris=None, registry_secrets=None, user=None, component=None, openshift_uri=None, source_registry_uri=None, yum_repourls=None, use_auth=None, builder_openshift_url=None, build_image=None, build_imagestream=None, proxy=None, sources_command=None, architecture=None, vendor=None, build_host=None, authoritative_registry=None, distribution_scope=None, koji_target=None, kojiroot=None, kojihub=None, koji_certs_secret=None, koji_use_kerberos=None, koji_kerberos_keytab=None, koji_kerberos_principal=None, koji_task_id=None, flatpak=False, module=None, module_compose_id=None, flatpak_base_image=None, odcs_url=None, odcs_insecure=False, odcs_openidc_secret=None, odcs_ssl_secret=None, pdc_url=None, pdc_insecure=False, filesystem_koji_task_id=None, source_secret=None, # compatibility name for pulp_secret pulp_secret=None, pulp_registry=None, smtp_host=None, smtp_from=None, smtp_email_domain=None, smtp_additional_addresses=None, smtp_error_addresses=None, smtp_to_submitter=None, smtp_to_pkgowner=None, git_branch=None, base_image=None, name_label=None, builder_build_json_dir=None, registry_api_versions=None, platforms=None, platform=None, build_type=None, release=None, reactor_config_secret=None, client_config_secret=None, token_secrets=None, arrangement_version=None, info_url_format=None, artifacts_allowed_domains=None, equal_labels=None, koji_upload_dir=None, yum_proxy=None, koji_parent_build=None, group_manifests=None, prefer_schema1_digest=None, signing_intent=None, compose_ids=None, **kwargs): self.git_uri.value = git_uri self.git_ref.value = git_ref self.user.value = user self.component.value = component self.proxy.value = proxy # registry_uri is the compatibility name for registry_uris if registry_uri is not None: assert registry_uris is None registry_uris = [registry_uri] self.registry_uris.value = registry_uris or [] self.registry_secrets.value = registry_secrets or [] self.source_registry_uri.value = source_registry_uri self.openshift_uri.value = openshift_uri self.builder_openshift_url.value = builder_openshift_url if not (yum_repourls is None or isinstance(yum_repourls, list)): raise OsbsValidationException("yum_repourls must be a list") self.yum_repourls.value = yum_repourls or [] self.use_auth.value = use_auth if build_imagestream and build_image: raise OsbsValidationException( 'Please only define build_image -OR- build_imagestream, not both' ) self.build_image.value = build_image or DEFAULT_BUILD_IMAGE self.build_imagestream.value = build_imagestream self.sources_command.value = sources_command self.architecture.value = architecture self.vendor.value = vendor self.build_host.value = build_host self.authoritative_registry.value = authoritative_registry self.distribution_scope.value = distribution_scope self.registry_api_versions.value = registry_api_versions self.koji_target.value = koji_target self.kojiroot.value = kojiroot self.kojihub.value = kojihub self.koji_certs_secret.value = koji_certs_secret self.koji_use_kerberos.value = koji_use_kerberos self.koji_kerberos_principal.value = koji_kerberos_principal self.koji_kerberos_keytab.value = koji_kerberos_keytab self.koji_task_id.value = koji_task_id self.flatpak.value = flatpak self.module.value = module self.module_compose_id.value = module_compose_id self.flatpak_base_image.value = flatpak_base_image self.odcs_url.value = odcs_url self.odcs_insecure.value = odcs_insecure self.odcs_openidc_secret.value = odcs_openidc_secret self.odcs_ssl_secret.value = odcs_ssl_secret self.pdc_url.value = pdc_url self.pdc_insecure.value = pdc_insecure self.pulp_secret.value = pulp_secret or source_secret self.pulp_registry.value = pulp_registry self.smtp_host.value = smtp_host self.smtp_from.value = smtp_from self.smtp_additional_addresses.value = smtp_additional_addresses self.smtp_error_addresses.value = smtp_error_addresses self.smtp_email_domain.value = smtp_email_domain self.smtp_to_submitter.value = smtp_to_submitter self.smtp_to_pkgowner.value = smtp_to_pkgowner self.git_branch.value = git_branch self.name.value = make_name_from_git(self.git_uri.value, self.git_branch.value) self.group_manifests.value = group_manifests or False self.prefer_schema1_digest.value = prefer_schema1_digest self.builder_build_json_dir.value = builder_build_json_dir if not flatpak: if not base_image: raise OsbsValidationException("base_image must be provided") self.trigger_imagestreamtag.value = get_imagestreamtag_from_image( base_image) if not name_label: raise OsbsValidationException("name_label must be provided") self.imagestream_name.value = name_label.replace('/', '-') # The ImageStream should take tags from the source registry # or, if no source registry is set, the first listed registry imagestream_reg = self.source_registry_uri.value if not imagestream_reg: try: imagestream_reg = self.registry_uris.value[0] except IndexError: logger.info( "no registries specified, cannot determine imagestream url" ) imagestream_reg = None if imagestream_reg: self.imagestream_url.value = os.path.join( imagestream_reg.docker_uri, name_label) logger.debug("setting 'imagestream_url' to '%s'", self.imagestream_url.value) insecure = imagestream_reg.uri.startswith('http://') self.imagestream_insecure_registry.value = insecure logger.debug("setting 'imagestream_insecure_registry' to %r", insecure) self.platforms.value = platforms self.platform.value = platform self.build_type.value = build_type self.release.value = release self.reactor_config_secret.value = reactor_config_secret self.client_config_secret.value = client_config_secret self.token_secrets.value = token_secrets or {} self.arrangement_version.value = arrangement_version self.info_url_format.value = info_url_format self.artifacts_allowed_domains.value = artifacts_allowed_domains self.equal_labels.value = equal_labels self.filesystem_koji_task_id.value = filesystem_koji_task_id self.koji_upload_dir.value = koji_upload_dir self.yum_proxy.value = yum_proxy self.koji_parent_build.value = koji_parent_build if (signing_intent or compose_ids) and not self.odcs_enabled(): raise OsbsValidationException( 'signing_intent and compose_ids are allowed only when ODCS is enabled' ) if signing_intent and compose_ids: raise OsbsValidationException( 'Please only define signing_intent -OR- compose_ids, not both') if compose_ids and yum_repourls: raise OsbsValidationException( 'Please only define yum_repourls -OR- compose_ids, not both') try: compose_ids and iter(compose_ids) except TypeError: raise OsbsValidationException("compose_ids must be a list") self.signing_intent.value = signing_intent self.compose_ids.value = compose_ids or [] self._populate_image_tag()
def test_make_name_from_git_collide(): bc1 = make_name_from_git("very_log_repo name_first", "also_long_branch_name", 30, '-') bc2 = make_name_from_git("very_log_repo name_second", "also_long_branch_name", 30, '-') assert bc1 != bc2
def test_make_name_from_git(repo, branch, limit, separator, expected): assert make_name_from_git(repo, branch, limit, separator) == expected
def set_params(self, git_uri=None, git_ref=None, git_branch=None, base_image=None, name_label=None, user=None, component=None, release=None, build_image=None, build_imagestream=None, build_from=None, platforms=None, platform=None, build_type=None, koji_target=None, koji_task_id=None, filesystem_koji_task_id=None, koji_parent_build=None, koji_upload_dir=None, flatpak=None, reactor_config_map=None, reactor_config_override=None, yum_repourls=None, signing_intent=None, compose_ids=None, isolated=None, scratch=None, parent_images_digests=None, tags_from_yaml=None, additional_tags=None, git_commit_depth=None, worker_deadline=None, orchestrator_deadline=None, operator_manifests_extract_platform=None, triggered_after_koji_task=None, **kwargs): self.git_uri.value = git_uri self.git_ref.value = git_ref self.git_branch.value = git_branch self.git_commit_depth.value = git_commit_depth self.tags_from_yaml.value = tags_from_yaml self.additional_tags.value = additional_tags or set() self.user.value = user self.component.value = component self.release.value = release self.build_type.value = build_type self.base_image.value = base_image self.name.value = make_name_from_git(self.git_uri.value, self.git_branch.value) self.reactor_config_map.value = reactor_config_map self.reactor_config_override.value = reactor_config_override unique_build_args = (build_imagestream, build_image, build_from) if sum(bool(a) for a in unique_build_args) != 1: raise OsbsValidationException( 'Please only define one of build_from, build_image, build_imagestream' ) self.build_image.value = build_image self.build_imagestream.value = build_imagestream if self.build_image.value or self.build_imagestream.value: logger.warning( "build_image or build_imagestream is defined, they are deprecated," "use build_from instead") if build_from: source_type, source_value = build_from.split(':', 1) if source_type not in ('image', 'imagestream'): raise OsbsValidationException( 'first part in build_from, may be only image or imagestream' ) if source_type == 'image': self.build_image.value = source_value else: self.build_imagestream.value = source_value self.parent_images_digests.value = parent_images_digests self.operator_manifests_extract_platform.value = operator_manifests_extract_platform self.platforms.value = platforms self.platform.value = platform self.koji_target.value = koji_target self.koji_task_id.value = koji_task_id self.filesystem_koji_task_id.value = filesystem_koji_task_id self.koji_parent_build.value = koji_parent_build self.koji_upload_dir.value = koji_upload_dir self.flatpak.value = flatpak self.isolated.value = isolated self.scratch.value = scratch self.triggered_after_koji_task.value = triggered_after_koji_task if not flatpak: if not base_image: raise OsbsValidationException("base_image must be provided") self.trigger_imagestreamtag.value = get_imagestreamtag_from_image( base_image) if not name_label: raise OsbsValidationException("name_label must be provided") self.imagestream_name.value = name_label.replace('/', '-') if signing_intent and compose_ids: raise OsbsValidationException( 'Please only define signing_intent -OR- compose_ids, not both') if not (compose_ids is None or isinstance(compose_ids, list)): raise OsbsValidationException("compose_ids must be a list") if not (yum_repourls is None or isinstance(yum_repourls, list)): raise OsbsValidationException("yum_repourls must be a list") self.yum_repourls.value = yum_repourls or [] self.signing_intent.value = signing_intent self.compose_ids.value = compose_ids or [] try: self.orchestrator_deadline.value = int(orchestrator_deadline) except (ValueError, TypeError): self.orchestrator_deadline.value = ORCHESTRATOR_MAX_RUNTIME try: self.worker_deadline.value = int(worker_deadline) except (ValueError, TypeError): self.worker_deadline.value = WORKER_MAX_RUNTIME self._populate_image_tag()
def set_params(self, git_uri=None, git_ref=None, registry_uri=None, # compatibility name for registry_uris registry_uris=None, registry_secrets=None, user=None, component=None, openshift_uri=None, source_registry_uri=None, yum_repourls=None, use_auth=None, builder_openshift_url=None, build_image=None, build_imagestream=None, proxy=None, sources_command=None, architecture=None, vendor=None, build_host=None, authoritative_registry=None, distribution_scope=None, koji_target=None, kojiroot=None, kojihub=None, koji_certs_secret=None, koji_task_id=None, source_secret=None, # compatibility name for pulp_secret pulp_secret=None, pulp_registry=None, pdc_secret=None, pdc_url=None, smtp_uri=None, nfs_server_path=None, nfs_dest_dir=None, git_branch=None, base_image=None, name_label=None, git_push_url=None, git_push_username=None, builder_build_json_dir=None, registry_api_versions=None, unique_tag_only=None, **kwargs): self.git_uri.value = git_uri self.git_ref.value = git_ref self.user.value = user self.component.value = component self.proxy.value = proxy # registry_uri is the compatibility name for registry_uris if registry_uri is not None: assert registry_uris is None registry_uris = [registry_uri] self.registry_uris.value = registry_uris or [] self.registry_secrets.value = registry_secrets or [] self.source_registry_uri.value = source_registry_uri self.openshift_uri.value = openshift_uri self.builder_openshift_url.value = builder_openshift_url if not (yum_repourls is None or isinstance(yum_repourls, list)): raise OsbsValidationException("yum_repourls must be a list") self.yum_repourls.value = yum_repourls or [] self.use_auth.value = use_auth self.build_image.value = build_image or DEFAULT_BUILD_IMAGE self.build_imagestream.value = build_imagestream self.sources_command.value = sources_command self.architecture.value = architecture self.vendor.value = vendor self.build_host.value = build_host self.authoritative_registry.value = authoritative_registry self.distribution_scope.value = distribution_scope self.registry_api_versions.value = registry_api_versions self.koji_target.value = koji_target self.kojiroot.value = kojiroot self.kojihub.value = kojihub self.koji_certs_secret.value = koji_certs_secret self.koji_task_id.value = koji_task_id self.pulp_secret.value = pulp_secret or source_secret self.pulp_registry.value = pulp_registry self.pdc_secret.value = pdc_secret self.pdc_url.value = pdc_url self.smtp_uri.value = smtp_uri self.nfs_server_path.value = nfs_server_path self.nfs_dest_dir.value = nfs_dest_dir self.git_push_url.value = git_push_url self.git_push_username.value = git_push_username self.git_branch.value = git_branch self.name.value = make_name_from_git(self.git_uri.value, self.git_branch.value) if not base_image: raise OsbsValidationException("base_image must be provided") self.trigger_imagestreamtag.value = get_imagestreamtag_from_image(base_image) self.builder_build_json_dir.value = builder_build_json_dir if not name_label: raise OsbsValidationException("name_label must be provided") self.imagestream_name.value = name_label.replace('/', '-') # The ImageStream should take tags from the source registry # or, if no source registry is set, the first listed registry imagestream_reg = self.source_registry_uri.value if not imagestream_reg: try: imagestream_reg = self.registry_uris.value[0] except IndexError: logger.info("no registries specified, cannot determine imagestream url") imagestream_reg = None if imagestream_reg: self.imagestream_url.value = os.path.join(imagestream_reg.docker_uri, name_label) logger.debug("setting 'imagestream_url' to '%s'", self.imagestream_url.value) insecure = imagestream_reg.uri.startswith('http://') self.imagestream_insecure_registry.value = insecure logger.debug("setting 'imagestream_insecure_registry' to %r", insecure) timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S') self.image_tag.value = "%s/%s:%s-%s" % ( self.user.value, self.component.value, self.koji_target.value or 'none', timestamp ) self.unique_tag_only.value = unique_tag_only
def set_params(self, git_uri=None, git_ref=None, registry_uri=None, # compatibility name for registry_uris registry_uris=None, registry_secrets=None, user=None, component=None, openshift_uri=None, source_registry_uri=None, yum_repourls=None, use_auth=None, builder_openshift_url=None, build_image=None, build_imagestream=None, proxy=None, sources_command=None, architecture=None, vendor=None, build_host=None, authoritative_registry=None, distribution_scope=None, koji_target=None, kojiroot=None, kojihub=None, koji_certs_secret=None, koji_use_kerberos=None, koji_kerberos_keytab=None, koji_kerberos_principal=None, koji_task_id=None, source_secret=None, # compatibility name for pulp_secret pulp_secret=None, pulp_registry=None, smtp_host=None, smtp_from=None, smtp_email_domain=None, smtp_additional_addresses=None, smtp_error_addresses=None, smtp_to_submitter=None, smtp_to_pkgowner=None, nfs_server_path=None, nfs_dest_dir=None, git_branch=None, base_image=None, name_label=None, builder_build_json_dir=None, registry_api_versions=None, platform=None, platforms=None, release=None, reactor_config_secret=None, client_config_secret=None, token_secrets=None, arrangement_version=None, info_url_format=None, artifacts_allowed_domains=None, **kwargs): self.git_uri.value = git_uri self.git_ref.value = git_ref self.user.value = user self.component.value = component self.proxy.value = proxy # registry_uri is the compatibility name for registry_uris if registry_uri is not None: assert registry_uris is None registry_uris = [registry_uri] self.registry_uris.value = registry_uris or [] self.registry_secrets.value = registry_secrets or [] self.source_registry_uri.value = source_registry_uri self.openshift_uri.value = openshift_uri self.builder_openshift_url.value = builder_openshift_url if not (yum_repourls is None or isinstance(yum_repourls, list)): raise OsbsValidationException("yum_repourls must be a list") self.yum_repourls.value = yum_repourls or [] self.use_auth.value = use_auth if build_imagestream and build_image: raise OsbsValidationException( 'Please only define build_image -OR- build_imagestream, not both') self.build_image.value = build_image or DEFAULT_BUILD_IMAGE self.build_imagestream.value = build_imagestream self.sources_command.value = sources_command self.architecture.value = architecture self.vendor.value = vendor self.build_host.value = build_host self.authoritative_registry.value = authoritative_registry self.distribution_scope.value = distribution_scope self.registry_api_versions.value = registry_api_versions self.koji_target.value = koji_target self.kojiroot.value = kojiroot self.kojihub.value = kojihub self.koji_certs_secret.value = koji_certs_secret self.koji_use_kerberos.value = koji_use_kerberos self.koji_kerberos_principal.value = koji_kerberos_principal self.koji_kerberos_keytab.value = koji_kerberos_keytab self.koji_task_id.value = koji_task_id self.pulp_secret.value = pulp_secret or source_secret self.pulp_registry.value = pulp_registry self.smtp_host.value = smtp_host self.smtp_from.value = smtp_from self.smtp_additional_addresses.value = smtp_additional_addresses self.smtp_error_addresses.value = smtp_error_addresses self.smtp_email_domain.value = smtp_email_domain self.smtp_to_submitter.value = smtp_to_submitter self.smtp_to_pkgowner.value = smtp_to_pkgowner self.nfs_server_path.value = nfs_server_path self.nfs_dest_dir.value = nfs_dest_dir self.git_branch.value = git_branch self.name.value = make_name_from_git(self.git_uri.value, self.git_branch.value) if not base_image: raise OsbsValidationException("base_image must be provided") self.trigger_imagestreamtag.value = get_imagestreamtag_from_image(base_image) self.builder_build_json_dir.value = builder_build_json_dir if not name_label: raise OsbsValidationException("name_label must be provided") self.imagestream_name.value = name_label.replace('/', '-') # The ImageStream should take tags from the source registry # or, if no source registry is set, the first listed registry imagestream_reg = self.source_registry_uri.value if not imagestream_reg: try: imagestream_reg = self.registry_uris.value[0] except IndexError: logger.info("no registries specified, cannot determine imagestream url") imagestream_reg = None if imagestream_reg: self.imagestream_url.value = os.path.join(imagestream_reg.docker_uri, name_label) logger.debug("setting 'imagestream_url' to '%s'", self.imagestream_url.value) insecure = imagestream_reg.uri.startswith('http://') self.imagestream_insecure_registry.value = insecure logger.debug("setting 'imagestream_insecure_registry' to %r", insecure) timestamp = utcnow().strftime('%Y%m%d%H%M%S') self.image_tag.value = "%s/%s:%s-%s-%s" % ( self.user.value, self.component.value, self.koji_target.value or 'none', random.randrange(10**(RAND_DIGITS - 1), 10**RAND_DIGITS), timestamp ) self.platform.value = platform self.platforms.value = platforms self.release.value = release self.reactor_config_secret.value = reactor_config_secret self.client_config_secret.value = client_config_secret self.token_secrets.value = token_secrets or {} self.arrangement_version.value = arrangement_version self.info_url_format.value = info_url_format self.artifacts_allowed_domains.value = artifacts_allowed_domains
def test_create_binary_container_pipeline_run(self, koji_task_id, isolated, scratch, release): rcm = 'rcm' rcm_scratch = 'rcm_scratch' with NamedTemporaryFile(mode="wt") as fp: fp.write(""" [default_binary] openshift_url = / namespace = {namespace} use_auth = false pipeline_run_path = {pipeline_run_path} reactor_config_map = {rcm} reactor_config_map_scratch = {rcm_scratch} """.format(namespace=TEST_OCP_NAMESPACE, pipeline_run_path=TEST_PIPELINE_RUN_TEMPLATE, rcm=rcm, rcm_scratch=rcm_scratch)) fp.flush() dummy_config = Configuration(fp.name, conf_section='default_binary') osbs = OSBS(dummy_config) random_postfix = 'sha-timestamp' (flexmock(utils).should_receive('generate_random_postfix').and_return( random_postfix)) name = utils.make_name_from_git(TEST_GIT_URI, TEST_GIT_BRANCH) pipeline_run_name = utils.make_name_from_git(TEST_GIT_URI, TEST_GIT_BRANCH) if isolated: pipeline_run_name = f'isolated-{random_postfix}' if scratch: pipeline_run_name = f'scratch-{random_postfix}' (flexmock(utils).should_receive('get_repo_info').with_args( TEST_GIT_URI, TEST_GIT_REF, git_branch=TEST_GIT_BRANCH, depth=None).and_return(self.mock_repo_info())) rand = '67890' timestr = '20170731111111' (flexmock(sys.modules['osbs.build.user_params']).should_receive( 'utcnow').once().and_return( datetime.datetime.strptime(timestr, '%Y%m%d%H%M%S'))) (flexmock(random).should_receive('randrange').with_args( 10**(len(rand) - 1), 10**len(rand)).and_return(int(rand))) image_tag = f'{TEST_USER}/{TEST_COMPONENT}:{TEST_TARGET}-{rand}-{timestr}' self.mock_start_pipeline() signing_intent = 'signing_intent' pipeline_run = osbs.create_binary_container_pipeline_run( target=TEST_TARGET, signing_intent=signing_intent, koji_task_id=koji_task_id, isolated=isolated, scratch=scratch, release=release, **REQUIRED_BUILD_ARGS) assert isinstance(pipeline_run, PipelineRun) assert pipeline_run.input_data['metadata']['name'] == pipeline_run_name for ws in pipeline_run.input_data['spec']['workspaces']: if ws['name'] == PRUN_TEMPLATE_REACTOR_CONFIG_WS: if scratch: assert ws['configmap']['name'] == rcm_scratch else: assert ws['configmap']['name'] == rcm if ws['name'] in [ PRUN_TEMPLATE_BUILD_DIR_WS, PRUN_TEMPLATE_CONTEXT_DIR_WS ]: assert ws['volumeClaimTemplate']['metadata'][ 'namespace'] == TEST_OCP_NAMESPACE for param in pipeline_run.input_data['spec']['params']: if param['name'] == PRUN_TEMPLATE_USER_PARAMS: assert param['value'] != {} up = json.loads(param['value']) expect_up = {} if scratch: expect_up['reactor_config_map'] = rcm_scratch expect_up['scratch'] = True else: expect_up['reactor_config_map'] = rcm expect_up['base_image'] = MockDfParser.baseimage expect_up['component'] = TEST_COMPONENT expect_up['git_branch'] = TEST_GIT_BRANCH expect_up['git_ref'] = TEST_GIT_REF expect_up['git_uri'] = TEST_GIT_URI expect_up['kind'] = BuildUserParams.KIND if koji_task_id: expect_up['koji_task_id'] = koji_task_id expect_up['name'] = name expect_up['koji_target'] = TEST_TARGET expect_up['user'] = TEST_USER expect_up['signing_intent'] = signing_intent if isolated: expect_up['isolated'] = True if release: expect_up['release'] = release expect_up['image_tag'] = image_tag assert up == expect_up
def set_params(self, git_uri=None, git_ref=None, registry_uri=None, # compatibility name for registry_uris registry_uris=None, registry_secrets=None, user=None, component=None, openshift_uri=None, source_registry_uri=None, yum_repourls=None, use_auth=None, builder_openshift_url=None, build_image=None, build_imagestream=None, proxy=None, sources_command=None, architecture=None, vendor=None, build_host=None, authoritative_registry=None, distribution_scope=None, koji_target=None, kojiroot=None, kojihub=None, koji_certs_secret=None, koji_task_id=None, source_secret=None, # compatibility name for pulp_secret pulp_secret=None, pulp_registry=None, pdc_secret=None, pdc_url=None, smtp_uri=None, nfs_server_path=None, nfs_dest_dir=None, git_branch=None, base_image=None, name_label=None, git_push_url=None, git_push_username=None, builder_build_json_dir=None, registry_api_versions=None, labels=None, **kwargs): self.git_uri.value = git_uri self.git_ref.value = git_ref self.user.value = user self.component.value = component self.proxy.value = proxy # registry_uri is the compatibility name for registry_uris if registry_uri is not None: assert registry_uris is None registry_uris = [registry_uri] self.registry_uris.value = registry_uris or [] self.registry_secrets.value = registry_secrets or [] self.source_registry_uri.value = source_registry_uri self.openshift_uri.value = openshift_uri self.builder_openshift_url.value = builder_openshift_url if not (yum_repourls is None or isinstance(yum_repourls, list)): raise OsbsValidationException("yum_repourls must be a list") self.yum_repourls.value = yum_repourls or [] self.use_auth.value = use_auth self.build_image.value = build_image or DEFAULT_BUILD_IMAGE self.build_imagestream.value = build_imagestream self.sources_command.value = sources_command self.architecture.value = architecture self.vendor.value = vendor self.build_host.value = build_host self.authoritative_registry.value = authoritative_registry self.distribution_scope.value = distribution_scope self.registry_api_versions.value = registry_api_versions self.koji_target.value = koji_target self.kojiroot.value = kojiroot self.kojihub.value = kojihub self.koji_certs_secret.value = koji_certs_secret self.koji_task_id.value = koji_task_id self.pulp_secret.value = pulp_secret or source_secret self.pulp_registry.value = pulp_registry self.pdc_secret.value = pdc_secret self.pdc_url.value = pdc_url self.smtp_uri.value = smtp_uri self.nfs_server_path.value = nfs_server_path self.nfs_dest_dir.value = nfs_dest_dir self.git_push_url.value = git_push_url self.git_push_username.value = git_push_username self.git_branch.value = git_branch self.name.value = make_name_from_git(self.git_uri.value, self.git_branch.value) if not base_image: raise OsbsValidationException("base_image must be provided") self.trigger_imagestreamtag.value = get_imagestreamtag_from_image(base_image) self.builder_build_json_dir.value = builder_build_json_dir self.labels.value = labels if not name_label: raise OsbsValidationException("name_label must be provided") self.imagestream_name.value = name_label.replace('/', '-') # The ImageStream should take tags from the source registry # or, if no source registry is set, the first listed registry imagestream_reg = self.source_registry_uri.value if not imagestream_reg: try: imagestream_reg = self.registry_uris.value[0] except IndexError: logger.info("no registries specified, cannot determine imagestream url") imagestream_reg = None if imagestream_reg: self.imagestream_url.value = os.path.join(imagestream_reg.docker_uri, name_label) logger.debug("setting 'imagestream_url' to '%s'", self.imagestream_url.value) insecure = imagestream_reg.uri.startswith('http://') self.imagestream_insecure_registry.value = insecure logger.debug("setting 'imagestream_insecure_registry' to %r", insecure) timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S') self.image_tag.value = "%s/%s:%s-%s" % ( self.user.value, self.component.value, self.koji_target.value or 'none', timestamp )
def set_params(self, git_uri=None, git_ref=None, git_branch=None, base_image=None, name_label=None, user=None, component=None, release=None, build_image=None, build_imagestream=None, build_from=None, platforms=None, platform=None, build_type=None, koji_target=None, koji_task_id=None, filesystem_koji_task_id=None, koji_parent_build=None, koji_upload_dir=None, flatpak=None, flatpak_base_image=None, reactor_config_map=None, reactor_config_override=None, yum_repourls=None, signing_intent=None, compose_ids=None, isolated=None, scratch=None, **kwargs): self.git_uri.value = git_uri self.git_ref.value = git_ref self.git_branch.value = git_branch self.user.value = user self.component.value = component self.release.value = release self.build_type.value = build_type self.base_image.value = base_image self.name.value = make_name_from_git(self.git_uri.value, self.git_branch.value) self.reactor_config_map.value = reactor_config_map self.reactor_config_override.value = reactor_config_override unique_build_args = (build_imagestream, build_image, build_from) if sum(bool(a) for a in unique_build_args) != 1: raise OsbsValidationException( 'Please only define one of build_from, build_image, build_imagestream' ) self.build_image.value = build_image self.build_imagestream.value = build_imagestream if self.build_image.value or self.build_imagestream.value: logger.warning( "build_image or build_imagestream is defined, they are deprecated," "use build_from instead") if build_from: source_type, source_value = build_from.split(':', 1) if source_type not in ('image', 'imagestream'): raise OsbsValidationException( 'first part in build_from, may be only image or imagestream' ) if source_type == 'image': self.build_image.value = source_value else: self.build_imagestream.value = source_value self.platforms.value = platforms self.platform.value = platform self.koji_target.value = koji_target self.koji_task_id.value = koji_task_id self.filesystem_koji_task_id.value = filesystem_koji_task_id self.koji_parent_build.value = koji_parent_build self.koji_upload_dir.value = koji_upload_dir self.flatpak.value = flatpak self.flatpak_base_image.value = flatpak_base_image self.isolated.value = isolated self.scratch.value = scratch if flatpak: if not flatpak_base_image: raise OsbsValidationException( "faltpak_base_image must be provided") else: if not base_image: raise OsbsValidationException("base_image must be provided") self.trigger_imagestreamtag.value = get_imagestreamtag_from_image( base_image) if not name_label: raise OsbsValidationException("name_label must be provided") self.imagestream_name.value = name_label.replace('/', '-') if signing_intent and compose_ids: raise OsbsValidationException( 'Please only define signing_intent -OR- compose_ids, not both') if compose_ids and yum_repourls: raise OsbsValidationException( 'Please only define yum_repourls -OR- compose_ids, not both') if not (compose_ids is None or isinstance(compose_ids, list)): raise OsbsValidationException("compose_ids must be a list") if not (yum_repourls is None or isinstance(yum_repourls, list)): raise OsbsValidationException("yum_repourls must be a list") self.yum_repourls.value = yum_repourls or [] self.signing_intent.value = signing_intent self.compose_ids.value = compose_ids or [] self._populate_image_tag()
def set_params(self, additional_tags=None, base_image=None, build_conf=None, build_type=None, compose_ids=None, dependency_replacements=None, filesystem_koji_task_id=None, flatpak=None, git_branch=None, git_commit_depth=None, git_ref=None, git_uri=None, include_koji_repo=None, is_auto=None, isolated=None, koji_parent_build=None, koji_upload_dir=None, name_label=None, operator_bundle_replacement_pullspecs=None, operator_manifests_extract_platform=None, auto_build_node_selector=None, explicit_build_node_selector=None, isolated_build_node_selector=None, platform_node_selector=None, scratch_build_node_selector=None, parent_images_digests=None, platform=None, platforms=None, release=None, remote_source_url=None, remote_source_build_args=None, repo_info=None, skip_build=None, tags_from_yaml=None, triggered_after_koji_task=None, yum_repourls=None, **kwargs): """ set parameters in the user parameters. Others are set in the super functions these parameters are accepted: :param build_conf: BuildConfiguration, optional build configuration :param build_type: str, orchestrator or worker :param compose_ids: list of int, ODCS composes to use instead of generating new ones :param dependency_replacements: list of str, dependencies to be replaced by cachito, as pkg_manager:name:version[:new_name] :param filesystem_koji_task_id: int, Koji Task that created the base filesystem :param flatpak: if we should build a Flatpak OCI Image :param git_branch: str, branch name of the branch to be pulled :param git_ref: str, commit ID of the branch to be pulled :param git_uri: str, uri of the git repository for the source :param include_koji_repo: include the repo from the target build tag, even if other repourls are provided. :param is_auto: bool, build as a automatic build :param isolated: bool, build as an isolated build :param koji_parent_build: str, :param koji_upload_dir: str, koji directory where the completed image will be uploaded :param name_label: str, label of the parent image :param user: str, name of the user requesting the build :param operator_bundle_replacement_pullspecs: dict, mapping of original pullspecs to replacement pullspecs for operator manifest bundle builds :param operator_manifests_extract_platform: str, indicates which platform should upload operator manifests to koji :param parent_images_digests: dict, mapping image digests to names and platforms :param platforms: list of str, platforms to build on :param platform: str, platform :param reactor_config_map: str, name of the config map containing the reactor environment :param reactor_config_override: dict, data structure for reactor config to be injected as an environment variable into a worker build; when used, reactor_config_map is ignored. :param release: str, :param repo_info: RepoInfo, git repo data for the build :param scratch: bool, build as a scratch build :param signing_intent: bool, True to sign the resulting image :param skip_build: bool, if we should skip build and just set buildconfig for autorebuilds :param triggered_after_koji_task: int, koji task ID from which was autorebuild triggered :param yum_repourls: list of str, uris of the yum repos to pull from Please keep the paramater list alphabetized for easier tracking of changes the following parameters are pulled from the BuildConfiguration (ie, build_conf) :param auto_build_node_selector: dict, a nodeselector for auto builds :param explicit_build_node_selector: dict, a nodeselector for explicit builds :param isolated_build_node_selector: dict, a nodeselector for isolated builds :param platform_node_selector: dict, a nodeselector for a user_paramsific platform :param scratch_build_node_selector: dict, a nodeselector for scratch builds the following parameters can be pulled from the RepoInfo (ie, repo_info) :param git_branch: str, branch name of the branch to be pulled :param git_ref: str, commit ID of the branch to be pulled :param git_uri: str, uri of the git repository for the source """ super(BuildUserParams, self).set_params(build_conf=build_conf, platform=platform, **kwargs) if repo_info: additional_tags = repo_info.additional_tags.tags git_branch = repo_info.git_branch git_commit_depth = repo_info.git_commit_depth git_ref = repo_info.git_ref git_uri = repo_info.git_uri tags_from_yaml = repo_info.additional_tags.from_container_yaml self.repo_info = repo_info elif not git_uri: raise OsbsValidationException( 'no repo_info passed to BuildUserParams') auto_build_node_selector = build_conf.get_auto_build_node_selector() explicit_build_node_selector = build_conf.get_explicit_build_node_selector( ) isolated_build_node_selector = build_conf.get_isolated_build_node_selector( ) platform_node_selector = build_conf.get_platform_node_selector( platform) scratch_build_node_selector = build_conf.get_scratch_build_node_selector( ) self.additional_tags.value = additional_tags or set() self.git_branch.value = git_branch self.git_commit_depth.value = git_commit_depth self.git_ref.value = git_ref self.git_uri.value = git_uri self.remote_source_url.value = remote_source_url self.remote_source_build_args.value = remote_source_build_args self.release.value = release self.build_type.value = build_type self.name.value = make_name_from_git(self.git_uri.value, self.git_branch.value) self.filesystem_koji_task_id.value = filesystem_koji_task_id self.is_auto.value = is_auto self.isolated.value = isolated self.flatpak.value = flatpak self.include_koji_repo.value = include_koji_repo self.koji_parent_build.value = koji_parent_build self.koji_upload_dir.value = koji_upload_dir self.parent_images_digests.value = parent_images_digests self.platforms.value = platforms self.operator_manifests_extract_platform.value = operator_manifests_extract_platform self.operator_bundle_replacement_pullspecs.value = operator_bundle_replacement_pullspecs self.skip_build.value = skip_build self.tags_from_yaml.value = tags_from_yaml self.triggered_after_koji_task.value = triggered_after_koji_task if not base_image: # For flatpaks, we can set this later from the reactor config if not flatpak: raise OsbsValidationException("base_image must be provided") else: self.set_base_image(base_image) if not name_label: raise OsbsValidationException("name_label must be provided") self.imagestream_name.value = name_label.replace('/', '-') if kwargs.get('signing_intent') and compose_ids: raise OsbsValidationException( 'Please only define signing_intent -OR- compose_ids, not both') if not (compose_ids is None or isinstance(compose_ids, list)): raise OsbsValidationException("compose_ids must be a list") if not (dependency_replacements is None or isinstance(dependency_replacements, list)): raise OsbsValidationException( "dependency_replacements must be a list") if not (yum_repourls is None or isinstance(yum_repourls, list)): raise OsbsValidationException("yum_repourls must be a list") self.compose_ids.value = compose_ids or [] self.dependency_replacements.value = dependency_replacements or [] self.yum_repourls.value = yum_repourls or [] if (self.scratch.value, self.is_auto.value, self.isolated.value).count(True) > 1: raise OsbsValidationException( 'Build variations are mutually exclusive. ' 'Must set either scratch, is_auto, isolated, or none. ') self.auto_build_node_selector = auto_build_node_selector or {} self.explicit_build_node_selector = explicit_build_node_selector or {} self.isolated_build_node_selector = isolated_build_node_selector or {} self.platform_node_selector = platform_node_selector or {} self.scratch_build_node_selector = scratch_build_node_selector or {}
def set_params(self, git_uri=None, git_ref=None, git_branch=None, base_image=None, name_label=None, release=None, platforms=None, build_type=None, filesystem_koji_task_id=None, koji_parent_build=None, koji_upload_dir=None, flatpak=None, yum_repourls=None, compose_ids=None, isolated=None, parent_images_digests=None, tags_from_yaml=None, additional_tags=None, git_commit_depth=None, operator_manifests_extract_platform=None, triggered_after_koji_task=None, **kwargs): super(BuildUserParams, self).set_params(**kwargs) self.git_uri.value = git_uri self.git_ref.value = git_ref self.git_branch.value = git_branch self.git_commit_depth.value = git_commit_depth self.tags_from_yaml.value = tags_from_yaml self.additional_tags.value = additional_tags or set() self.release.value = release self.build_type.value = build_type self.base_image.value = base_image self.name.value = make_name_from_git(self.git_uri.value, self.git_branch.value) self.parent_images_digests.value = parent_images_digests self.operator_manifests_extract_platform.value = operator_manifests_extract_platform self.platforms.value = platforms self.filesystem_koji_task_id.value = filesystem_koji_task_id self.koji_parent_build.value = koji_parent_build self.koji_upload_dir.value = koji_upload_dir self.flatpak.value = flatpak self.isolated.value = isolated self.triggered_after_koji_task.value = triggered_after_koji_task if not flatpak: if not base_image: raise OsbsValidationException("base_image must be provided") self.trigger_imagestreamtag.value = get_imagestreamtag_from_image( base_image) if not name_label: raise OsbsValidationException("name_label must be provided") self.imagestream_name.value = name_label.replace('/', '-') if kwargs.get('signing_intent') and compose_ids: raise OsbsValidationException( 'Please only define signing_intent -OR- compose_ids, not both') if not (compose_ids is None or isinstance(compose_ids, list)): raise OsbsValidationException("compose_ids must be a list") if not (yum_repourls is None or isinstance(yum_repourls, list)): raise OsbsValidationException("yum_repourls must be a list") self.yum_repourls.value = yum_repourls or [] self.compose_ids.value = compose_ids or []
def set_params(self, sources_command=None, architecture=None, vendor=None, build_host=None, authoritative_registry=None, distribution_scope=None, koji_target=None, kojiroot=None, kojihub=None, koji_certs_secret=None, koji_task_id=None, source_secret=None, # compatibility name for pulp_secret pulp_secret=None, pulp_registry=None, pdc_secret=None, pdc_url=None, smtp_uri=None, nfs_server_path=None, nfs_dest_dir=None, git_branch=None, base_image=None, name_label=None, git_push_url=None, git_push_username=None, builder_build_json_dir=None, registry_api_versions=None, **kwargs): super(ProdSpec, self).set_params(**kwargs) self.sources_command.value = sources_command self.architecture.value = architecture self.vendor.value = vendor self.build_host.value = build_host self.authoritative_registry.value = authoritative_registry self.distribution_scope.value = distribution_scope self.registry_api_versions.value = registry_api_versions self.koji_target.value = koji_target self.kojiroot.value = kojiroot self.kojihub.value = kojihub self.koji_certs_secret.value = koji_certs_secret self.koji_task_id.value = koji_task_id self.pulp_secret.value = pulp_secret or source_secret self.pulp_registry.value = pulp_registry self.pdc_secret.value = pdc_secret self.pdc_url.value = pdc_url self.smtp_uri.value = smtp_uri self.nfs_server_path.value = nfs_server_path self.nfs_dest_dir.value = nfs_dest_dir self.git_push_url.value = git_push_url self.git_push_username.value = git_push_username self.git_branch.value = git_branch self.name.value = make_name_from_git(self.git_uri.value, self.git_branch.value) self.trigger_imagestreamtag.value = get_imagestreamtag_from_image(base_image) self.builder_build_json_dir.value = builder_build_json_dir self.imagestream_name.value = name_label.replace('/', '-') # The ImageStream should take tags from the source registry # or, if no source registry is set, the first listed registry imagestream_reg = self.source_registry_uri.value if not imagestream_reg: try: imagestream_reg = self.registry_uris.value[0] except IndexError: raise OsbsValidationException("No registries specified") self.imagestream_url.value = os.path.join(imagestream_reg.docker_uri, name_label) logger.debug("setting 'imagestream_url' to '%s'", self.imagestream_url.value) insecure = imagestream_reg.uri.startswith('http://') self.imagestream_insecure_registry.value = insecure logger.debug("setting 'imagestream_insecure_registry' to %r", insecure) timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S') self.image_tag.value = "%s/%s:%s-%s" % ( self.user.value, self.component.value, self.koji_target.value or 'none', timestamp )