Hello community, here is the log from the commit of package openSUSE-release-tools for openSUSE:Factory checked in at 2018-10-04 19:02:49 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/openSUSE-release-tools (Old) and /work/SRC/openSUSE:Factory/.openSUSE-release-tools.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "openSUSE-release-tools" Thu Oct 4 19:02:49 2018 rev:134 rq:639934 version:20181004.97e58e1 Changes: -------- --- /work/SRC/openSUSE:Factory/openSUSE-release-tools/openSUSE-release-tools.changes 2018-09-24 13:11:57.989843257 +0200 +++ /work/SRC/openSUSE:Factory/.openSUSE-release-tools.new/openSUSE-release-tools.changes 2018-10-04 19:02:56.655111885 +0200 @@ -1,0 +2,77 @@ +Thu Oct 04 09:36:17 UTC 2018 - opensuse-releaset...@opensuse.org + +- Update to version 20181004.97e58e1: + * Do no longer CC submitters in request comments + +------------------------------------------------------------------- +Thu Oct 04 08:03:59 UTC 2018 - opensuse-releaset...@opensuse.org + +- Update to version 20181004.caee905: + * pkglistgen: Make sure we don't calculate non-existant architectures in stagings + +------------------------------------------------------------------- +Thu Oct 04 05:05:23 UTC 2018 - opensuse-releaset...@opensuse.org + +- Update to version 20181004.5ba0b87: + * Refactor conditional_PUT as core function + * pkglistgen: only PUT new data if it changed + +------------------------------------------------------------------- +Sat Sep 29 05:28:13 UTC 2018 - opensuse-releaset...@opensuse.org + +- Update to version 20180929.39a3f83: + * repo_checker: re-instate staging build failure check after generic rework. + * pkglistgen: Only check repository check per arch + * Optimize repository_state + +------------------------------------------------------------------- +Thu Sep 27 13:29:40 UTC 2018 - opensuse-releaset...@opensuse.org + +- Update to version 20180927.2deda1a: + * osclib/core: repository_state(): rework to utilize binarylist view. + +------------------------------------------------------------------- +Thu Sep 27 05:22:25 UTC 2018 - opensuse-releaset...@opensuse.org + +- Update to version 20180927.ed9afea: + * Move creation of the Solver object out of loop + +------------------------------------------------------------------- +Wed Sep 26 22:32:59 UTC 2018 - opensuse-releaset...@opensuse.org + +- Update to version 20180926.ea94191: + * dist/kubernetes: provide README covering basic operation. + * dist/kubernetes: provide repo-checker module. + * dist/kubernetes: provide check-source module. + * dist/kubernetes: provide base review_bot component prototype. + * dist/kubernetes: provide basic ksonnet setup for heroes cluster. + * dist/kiwi: provide kiwi for building worker-obs container. + * k8s-secret: provide tool to generate kubernetes secrets containing oscrc. + * osclib/cache_manager: rework base directory handling. + * dist/ci/osc-init: allow output file location to be set via OSCRC env var. + +------------------------------------------------------------------- +Wed Sep 26 08:07:41 UTC 2018 - opensuse-releaset...@opensuse.org + +- Update to version 20180926.015677f: + * Don't take unsorted.group as reference for SP1 product changes + +------------------------------------------------------------------- +Mon Sep 24 15:40:56 UTC 2018 - opensuse-releaset...@opensuse.org + +- Update to version 20180924.1527c61: + * check_tags_in_requests: factory property is actually an array + +------------------------------------------------------------------- +Fri Sep 21 12:36:48 UTC 2018 - opensuse-releaset...@opensuse.org + +- Update to version 20180921.e409a67: + * pkglistgen: compare repository state to determine when to update solv. + +------------------------------------------------------------------- +Thu Sep 20 14:21:42 UTC 2018 - opensuse-releaset...@opensuse.org + +- Update to version 20180920.35ea0e1: + * systemd/metrics-access.timer: utilize compatible calendar format. + +------------------------------------------------------------------- Old: ---- openSUSE-release-tools-20180918.38e2d3f.obscpio New: ---- openSUSE-release-tools-20181004.97e58e1.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ openSUSE-release-tools.spec ++++++ --- /var/tmp/diff_new_pack.xnSUGO/_old 2018-10-04 19:03:02.035106216 +0200 +++ /var/tmp/diff_new_pack.xnSUGO/_new 2018-10-04 19:03:02.035106216 +0200 @@ -20,7 +20,7 @@ %define source_dir openSUSE-release-tools %define announcer_filename factory-package-news Name: openSUSE-release-tools -Version: 20180918.38e2d3f +Version: 20181004.97e58e1 Release: 0 Summary: Tools to aid in staging and release work for openSUSE/SUSE License: GPL-2.0-or-later AND MIT @@ -403,6 +403,7 @@ %{_bindir}/osrt-fcc_submitter %{_bindir}/osrt-findfileconflicts %{_bindir}/osrt-issue-diff +%{_bindir}/osrt-k8s-secret %{_bindir}/osrt-legal-auto %{_bindir}/osrt-obs_clone %{_bindir}/osrt-openqa-maintenance ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.xnSUGO/_old 2018-10-04 19:03:02.079106170 +0200 +++ /var/tmp/diff_new_pack.xnSUGO/_new 2018-10-04 19:03:02.079106170 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/openSUSE/openSUSE-release-tools.git</param> - <param name="changesrevision">38e2d3fa1c5cb72c91686aa91e70d89650fee0f6</param> + <param name="changesrevision">97e58e173287133d05b7ad4bcfc451ae679401d1</param> </service> </servicedata> ++++++ openSUSE-release-tools-20180918.38e2d3f.obscpio -> openSUSE-release-tools-20181004.97e58e1.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/check_tags_in_requests.py new/openSUSE-release-tools-20181004.97e58e1/check_tags_in_requests.py --- old/openSUSE-release-tools-20180918.38e2d3f/check_tags_in_requests.py 2018-09-18 23:45:12.000000000 +0200 +++ new/openSUSE-release-tools-20181004.97e58e1/check_tags_in_requests.py 2018-10-04 11:29:32.000000000 +0200 @@ -141,7 +141,7 @@ bot = ReviewBot.CommandLineInterface.setup_checker(self) if self.options.factory: - bot.factory = self.options.factory + bot.factory = [ self.options.factory ] return bot diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/dist/ci/osc-init new/openSUSE-release-tools-20181004.97e58e1/dist/ci/osc-init --- old/openSUSE-release-tools-20180918.38e2d3f/dist/ci/osc-init 2018-09-18 23:45:12.000000000 +0200 +++ new/openSUSE-release-tools-20181004.97e58e1/dist/ci/osc-init 2018-10-04 11:29:32.000000000 +0200 @@ -1,5 +1,6 @@ #!/bin/bash +: ${OSCRC:=~/.oscrc} OBS_API="${OBS_API:-https://api.opensuse.org}" if [ -z ${OBS_PASS+x} ] || [ -z "$OBS_PASS" ] ; then OBS_API="$OBS_API/public" @@ -8,7 +9,7 @@ echo "OBS_API=$OBS_API" echo "OBS_USER=$OBS_USER" -cat << eom > ~/.oscrc +cat << eom > "$OSCRC" [general] apiurl = $OBS_API [$OBS_API] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/dist/kiwi/osrt-worker-obs.kiwi new/openSUSE-release-tools-20181004.97e58e1/dist/kiwi/osrt-worker-obs.kiwi --- old/openSUSE-release-tools-20180918.38e2d3f/dist/kiwi/osrt-worker-obs.kiwi 1970-01-01 01:00:00.000000000 +0100 +++ new/openSUSE-release-tools-20181004.97e58e1/dist/kiwi/osrt-worker-obs.kiwi 2018-10-04 11:29:32.000000000 +0200 @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<image schemaversion="6.5" name="osrt-worker-obs"> + <description type="system"> + <author>openSUSE Release Team</author> + <contact>opensuse-releaset...@opensuse.org</contact> + <specification>openSUSE Release Tools (OSRT) worker for OBS container image</specification> + </description> + <preferences> + <type image="docker" derived_from="obsrepositories:/opensuse/tumbleweed#current"> +<!-- <containerconfig name="osrt/worker-obs" tag="%%TAG%%" additionaltags="latest"/> --> + <containerconfig name="osrt/worker-obs" tag="latest"/> + </type> + <version>1.0.0</version> + <packagemanager>zypper</packagemanager> + <rpm-check-signatures>false</rpm-check-signatures> + <rpm-excludedocs>true</rpm-excludedocs> + </preferences> + <repository> + <source path="obsrepositories:/"/> + </repository> + <packages type="image"> + <package name="openSUSE-release-tools-check-source"/> + <package name="openSUSE-release-tools-leaper"/> + <package name="openSUSE-release-tools-pkglistgen"/> + <package name="openSUSE-release-tools-repo-checker"/> + <package name="openSUSE-release-tools-staging-bot"/> + </packages> +</image> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/README.md new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/README.md --- old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/README.md 1970-01-01 01:00:00.000000000 +0100 +++ new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/README.md 2018-10-04 11:29:32.000000000 +0200 @@ -0,0 +1,35 @@ +# OSRT Kubernetes + +The commands assume running from `dist/kubernetes`. + +## namespace + +If desired create the `osrt` namespace and set as current context namespace. + + kubectl create namespace osrt + kubectl config set-context $(kubectl config current-context) --namespace=osrt + +## secrets + +Create secrets for each module, containing `.oscrc`, by enter OBS credentials. + + ./k8s-secret.py check-source + ./k8s-secret.py repo-checker + +## modules + +Adjust modules in `app.yaml` or configure a new environment. + + ks env add --context heroes newenv + ks env targets --module / --module check-source newenv + +## configure + +- See `environments/*/{globals,params}.libsonnet` for environment specific configuration of components. +- See `components/*` for more detailed changes (like the command executed). + +## apply + + ks show heroes + ks diff heroes + ks apply heroes diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/app.yaml new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/app.yaml --- old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/app.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/app.yaml 2018-10-04 11:29:32.000000000 +0200 @@ -0,0 +1,14 @@ +apiVersion: 0.2.0 +environments: + heroes: + destination: + namespace: osrt + server: https://caasp-master.infra.opensuse.org:6443 + k8sVersion: v1.8.0 + path: heroes + targets: + - check-source + - repo-checker +kind: ksonnet.io/app +name: openSUSE-release-tools +version: 0.0.1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/components/check-source/params.libsonnet new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/components/check-source/params.libsonnet --- old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/components/check-source/params.libsonnet 1970-01-01 01:00:00.000000000 +0100 +++ new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/components/check-source/params.libsonnet 2018-10-04 11:29:32.000000000 +0200 @@ -0,0 +1,13 @@ +{ + global: { + cpu: "100m", + memory: "64Mi", + cache: "64Mi", + image: null, + prefix: "check-source", + }, + components: { + review: { + }, + }, +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/components/check-source/review.jsonnet new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/components/check-source/review.jsonnet --- old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/components/check-source/review.jsonnet 1970-01-01 01:00:00.000000000 +0100 +++ new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/components/check-source/review.jsonnet 2018-10-04 11:29:32.000000000 +0200 @@ -0,0 +1,12 @@ +local params = std.extVar("__ksonnet/params").components.review; +local review_bot = import '../review_bot.libsonnet'; + +[ + review_bot.parts.cache.base( + params.prefix, params.cache), + + review_bot.parts.cron.base( + params.prefix, "review", + "*/3 * * * *", params.cpu, params.memory, params.image, + "osrt-check_source --verbose --group factory-auto review"), +] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/components/params.libsonnet new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/components/params.libsonnet --- old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/components/params.libsonnet 1970-01-01 01:00:00.000000000 +0100 +++ new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/components/params.libsonnet 2018-10-04 11:29:32.000000000 +0200 @@ -0,0 +1,6 @@ +{ + global: { + }, + components: { + }, +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/components/repo-checker/params.libsonnet new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/components/repo-checker/params.libsonnet --- old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/components/repo-checker/params.libsonnet 1970-01-01 01:00:00.000000000 +0100 +++ new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/components/repo-checker/params.libsonnet 2018-10-04 11:29:32.000000000 +0200 @@ -0,0 +1,16 @@ +{ + global: { + cpu: "1", + memory: "2.5Gi", + cache: "100Gi", + image: null, + prefix: "repo-checker", + }, + components: { + review: { + }, + project_only: { + projects: [], + } + }, +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/components/repo-checker/project_only.jsonnet new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/components/repo-checker/project_only.jsonnet --- old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/components/repo-checker/project_only.jsonnet 1970-01-01 01:00:00.000000000 +0100 +++ new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/components/repo-checker/project_only.jsonnet 2018-10-04 11:29:32.000000000 +0200 @@ -0,0 +1,10 @@ +local params = std.extVar("__ksonnet/params").components.project_only; +local review_bot = import '../review_bot.libsonnet'; + +[ + review_bot.parts.cron.base( + params.prefix, "project-only-" + std.asciiLower(std.strReplace(project, ":", "-")), + "0 * * * *", params.cpu, params.memory, params.image, + "osrt-repo_checker --debug project_only '" + project + "'") + for project in params.projects +] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/components/repo-checker/review.jsonnet new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/components/repo-checker/review.jsonnet --- old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/components/repo-checker/review.jsonnet 1970-01-01 01:00:00.000000000 +0100 +++ new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/components/repo-checker/review.jsonnet 2018-10-04 11:29:32.000000000 +0200 @@ -0,0 +1,12 @@ +local params = std.extVar("__ksonnet/params").components.review; +local review_bot = import '../review_bot.libsonnet'; + +[ + review_bot.parts.cache.base( + params.prefix, params.cache), + + review_bot.parts.cron.base( + params.prefix, "review", + "*/5 * * * *", params.cpu, params.memory, params.image, + "osrt-repo_checker --debug review"), +] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/components/review_bot.libsonnet new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/components/review_bot.libsonnet --- old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/components/review_bot.libsonnet 1970-01-01 01:00:00.000000000 +0100 +++ new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/components/review_bot.libsonnet 2018-10-04 11:29:32.000000000 +0200 @@ -0,0 +1,77 @@ +{ + parts:: { + cron:: { + base(prefix, name, schedule, cpu, memory, image, command):: { + apiVersion: "batch/v1beta1", + kind: "CronJob", + metadata: { + name: prefix + "-" + name, + }, + spec: { + schedule: schedule, + concurrencyPolicy: "Forbid", + jobTemplate: { spec: { template: { spec: { + containers: [{ + name: "worker", + image: image, + args: [ + "/bin/bash", "-c", + "cp /secret/.oscrc /root && osc staging --version && du -h ~/.cache && " + command + ], + volumeMounts: [ + { + name: "oscrc", + mountPath: "/secret", + readOnly: true, + }, + { + name: "cache", + mountPath: "/root/.cache", + }, + ], + resources: { + requests: { + cpu: cpu, + memory: memory, + } + } + }], + restartPolicy: "Never", + volumes: [ + { + name: "oscrc", + secret: { + secretName: prefix + "-oscrc", + } + }, + { + name: "cache", + persistentVolumeClaim: { + claimName: prefix + "-pvc" + } + } + ], + } } } } + } + } + }, + + cache:: { + base(prefix, capacity):: { + apiVersion: "v1", + kind: "PersistentVolumeClaim", + metadata: { + name: prefix + "-pvc", + }, + spec: { + accessModes: ["ReadWriteMany"], + resources: { + requests: { + storage: capacity, + } + } + } + } + }, + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/environments/base.libsonnet new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/environments/base.libsonnet --- old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/environments/base.libsonnet 1970-01-01 01:00:00.000000000 +0100 +++ new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/environments/base.libsonnet 2018-10-04 11:29:32.000000000 +0200 @@ -0,0 +1,3 @@ +local components = std.extVar("__ksonnet/components"); +components + { +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/environments/heroes/globals.libsonnet new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/environments/heroes/globals.libsonnet --- old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/environments/heroes/globals.libsonnet 1970-01-01 01:00:00.000000000 +0100 +++ new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/environments/heroes/globals.libsonnet 2018-10-04 11:29:32.000000000 +0200 @@ -0,0 +1,7 @@ +local image = "registry.opensuse.org/home/jberry/container/container/osrt/worker-obs"; +local image_version = "latest"; +local image_full = image + ':' + image_version; + +{ + image: image_full, +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/environments/heroes/main.jsonnet new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/environments/heroes/main.jsonnet --- old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/environments/heroes/main.jsonnet 1970-01-01 01:00:00.000000000 +0100 +++ new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/environments/heroes/main.jsonnet 2018-10-04 11:29:32.000000000 +0200 @@ -0,0 +1,4 @@ +local base = import "base.libsonnet"; + +base + { +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/environments/heroes/params.libsonnet new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/environments/heroes/params.libsonnet --- old/openSUSE-release-tools-20180918.38e2d3f/dist/kubernetes/environments/heroes/params.libsonnet 1970-01-01 01:00:00.000000000 +0100 +++ new/openSUSE-release-tools-20181004.97e58e1/dist/kubernetes/environments/heroes/params.libsonnet 2018-10-04 11:29:32.000000000 +0200 @@ -0,0 +1,20 @@ +local params = std.extVar("__ksonnet/params"); +local globals = import "globals.libsonnet"; +local envParams = params + { + components+: { + "repo-checker.project_only"+: { + projects: [ + "openSUSE:Factory", + "openSUSE:Leap:15.0:Update", + "openSUSE:Leap:15.1", + ], + }, + }, +}; + +{ + components: { + [x]: envParams.components[x] + globals, + for x in std.objectFields(envParams.components) + }, +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/dist/package/openSUSE-release-tools.spec new/openSUSE-release-tools-20181004.97e58e1/dist/package/openSUSE-release-tools.spec --- old/openSUSE-release-tools-20180918.38e2d3f/dist/package/openSUSE-release-tools.spec 2018-09-18 23:45:12.000000000 +0200 +++ new/openSUSE-release-tools-20181004.97e58e1/dist/package/openSUSE-release-tools.spec 2018-10-04 11:29:32.000000000 +0200 @@ -403,6 +403,7 @@ %{_bindir}/osrt-fcc_submitter %{_bindir}/osrt-findfileconflicts %{_bindir}/osrt-issue-diff +%{_bindir}/osrt-k8s-secret %{_bindir}/osrt-legal-auto %{_bindir}/osrt-obs_clone %{_bindir}/osrt-openqa-maintenance diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/k8s-secret.py new/openSUSE-release-tools-20181004.97e58e1/k8s-secret.py --- old/openSUSE-release-tools-20180918.38e2d3f/k8s-secret.py 1970-01-01 01:00:00.000000000 +0100 +++ new/openSUSE-release-tools-20181004.97e58e1/k8s-secret.py 2018-10-04 11:29:32.000000000 +0200 @@ -0,0 +1,57 @@ +#!/usr/bin/python + +from __future__ import print_function +import argparse +import os +from osclib.cache_manager import CacheManager +import subprocess +import sys + +CACHE_DIR = CacheManager.directory('k8s-secret') +SCRIPT_PATH = os.path.dirname(os.path.realpath(__file__)) + + +def secret_create(cache_file): + environment = {'OSCRC': cache_file} + + print('Username: ', end='') + environment['OBS_USER'] = raw_input() + + print('Password: ', end='') + environment['OBS_PASS'] = raw_input() + + osc_init = os.path.join(SCRIPT_PATH, 'dist/ci/osc-init') + subprocess.Popen([osc_init], env=environment).wait() + +def secret_apply(prefix, cache_file): + print(subprocess.check_output([ + 'kubectl', 'create', 'secret', 'generic', + '{}-oscrc'.format(prefix), '--from-file={}={}'.format('.oscrc', cache_file)])) + +def main(args): + cache_file = os.path.join(CACHE_DIR, args.prefix) + if not os.path.exists(cache_file) or args.create: + secret_create(cache_file) + + with open(cache_file, 'r') as f: + print(f.read()) + + print('Apply secret for {} [y/n] (y): '.format(args.prefix), end='') + response = raw_input().lower() + if response != '' and response != 'y': + return + + secret_apply(args.prefix, cache_file) + + if args.delete: + os.remove(cache_file) + +if __name__ == '__main__': + description = 'Apply kubernetes secrets for OSRT tool osc configuration.' + parser = argparse.ArgumentParser(description=description) + parser.add_argument('--create', action='store_true', help='create regardless of existing file') + parser.add_argument('--delete', action='store_true', help='delete cached secret after application') + parser.add_argument('prefix', help='prefix for which to create secret (ex. check-source, repo-checker)') + args = parser.parse_args() + + sys.exit(main(args)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/osclib/cache_manager.py new/openSUSE-release-tools-20181004.97e58e1/osclib/cache_manager.py --- old/openSUSE-release-tools-20180918.38e2d3f/osclib/cache_manager.py 2018-09-18 23:45:12.000000000 +0200 +++ new/openSUSE-release-tools-20181004.97e58e1/osclib/cache_manager.py 2018-10-04 11:29:32.000000000 +0200 @@ -12,21 +12,18 @@ # This manager ensures that the entire cache is pruned periodically to remove # files that have not been accessed recently and avoid endless growth. class CacheManager(object): - DIRECTORY = save_cache_path(NAME) PRUNE_FREQUENCY = 60 * 60 * 24 * 7 PRUNE_TTL = 60 * 60 * 24 * 30 pruned = False + test = False @staticmethod def directory(*args): CacheManager.prune_all() - return os.path.join(CacheManager.DIRECTORY, *args) - - @staticmethod - def directory_test(): - if not CacheManager.DIRECTORY.endswith('.test'): - CacheManager.DIRECTORY = os.path.join(CacheManager.DIRECTORY, '.test') + if CacheManager.test: + return save_cache_path(NAME, '.test', *args) + return save_cache_path(NAME, *args) @staticmethod def prune_all(): @@ -34,7 +31,7 @@ return CacheManager.pruned = True - prune_lock = os.path.join(CacheManager.DIRECTORY, '.prune') + prune_lock = os.path.join(CacheManager.directory(), '.prune') if not os.path.exists(prune_lock): CacheManager.migrate() elif time() - os.stat(prune_lock).st_mtime < CacheManager.PRUNE_FREQUENCY: @@ -48,7 +45,7 @@ accessed_prune = time() - CacheManager.PRUNE_TTL files_pruned = 0 bytes_pruned = 0 - for directory, subdirectories, files in os.walk(CacheManager.DIRECTORY): + for directory, subdirectories, files in os.walk(CacheManager.directory()): files_pruned_directory = 0 for filename in files: path = os.path.join(directory, filename) @@ -79,9 +76,9 @@ print('> migrating caches', file=sys.stderr) # Move existing dir out of the way in order to nest. - cache_moved = CacheManager.DIRECTORY + '-main' + cache_moved = CacheManager.directory() + '-main' if not os.path.exists(cache_moved): - os.rename(CacheManager.DIRECTORY, cache_moved) + os.rename(CacheManager.directory(), cache_moved) # Detected need to migrate, but may have already passed -main. CacheManager.migrate(False) @@ -128,6 +125,6 @@ for source, destination in path_map.items(): source = os.path.join(cache_root, source.format(base)) if destination: - destination = os.path.join(CacheManager.DIRECTORY, destination) + destination = os.path.join(CacheManager.directory(), destination) yield source, destination diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/osclib/core.py new/openSUSE-release-tools-20181004.97e58e1/osclib/core.py --- old/openSUSE-release-tools-20180918.38e2d3f/osclib/core.py 2018-09-18 23:45:12.000000000 +0200 +++ new/openSUSE-release-tools-20181004.97e58e1/osclib/core.py 2018-10-04 11:29:32.000000000 +0200 @@ -265,6 +265,10 @@ url = makeurl(apiurl, ['source', project, package, filename], {'comment': comment}) http_PUT(url, data=content) +def source_file_ensure(apiurl, project, package, filename, content, comment=None): + if content != source_file_load(apiurl, project, package, filename): + source_file_save(apiurl, project, package, filename, content, comment) + def project_pseudometa_package(apiurl, project): package = Config.get(apiurl, project).get('pseudometa_package', '00Meta') if '/' in package: @@ -382,9 +386,20 @@ return None +def repository_arch_state(apiurl, project, repository, arch): + # just checking the mtimes of the repository's binaries + url = makeurl(apiurl, ['build', project, repository, arch, '_repository']) + from osclib.util import sha1_short + return sha1_short(http_GET(url).read()) + def repository_state(apiurl, project, repository): - return ET.fromstringlist(show_results_meta( - apiurl, project, multibuild=True, repository=[repository])).get('state') + # Unfortunately, the state hash reflects the published state and not the + # binaries published in repository. As such request binary list and hash. + combined_state = [] + for arch in target_archs(apiurl, project, repository): + combined_state.append(repository_arch_state(apiurl, project, repository, arch)) + from osclib.util import sha1_short + return sha1_short(combined_state) def repositories_states(apiurl, repository_pairs): states = [] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/osclib/stagingapi.py new/openSUSE-release-tools-20181004.97e58e1/osclib/stagingapi.py --- old/openSUSE-release-tools-20180918.38e2d3f/osclib/stagingapi.py 2018-09-18 23:45:12.000000000 +0200 +++ new/openSUSE-release-tools-20181004.97e58e1/osclib/stagingapi.py 2018-10-04 11:29:32.000000000 +0200 @@ -1555,7 +1555,7 @@ requests = meta['requests'] for req in requests: - lines.append(' * {}request#{} for package {} submitted by @{}'.format( + lines.append(' * {}request#{} for package {} submitted by {}'.format( req.get('prefix', ''), req['id'], req['package'], req.get('author'))) msg = '\n'.join(lines) msg = comment_api.add_marker(msg, bot, info) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/pkglistgen.py new/openSUSE-release-tools-20181004.97e58e1/pkglistgen.py --- old/openSUSE-release-tools-20180918.38e2d3f/pkglistgen.py 2018-09-18 23:45:12.000000000 +0200 +++ new/openSUSE-release-tools-20181004.97e58e1/pkglistgen.py 2018-10-04 11:29:32.000000000 +0200 @@ -16,12 +16,16 @@ from osc.core import http_GET, http_PUT from osc.core import makeurl from osc.core import Package +from osc.core import HTTPError from osc.core import show_results_meta from osc.core import undelete_package from osc import conf from osclib.cache_manager import CacheManager from osclib.conf import Config, str2bool from osclib.core import repository_path_expand +from osclib.core import repository_arch_state +from osclib.core import source_file_ensure +from osclib.core import target_archs from osclib.stagingapi import StagingAPI from osclib.util import project_list_family from osclib.util import project_list_family_prior @@ -43,6 +47,7 @@ import random import shutil import string +import time import ToolBase @@ -134,7 +139,7 @@ # do not repeat packages def ignore(self, without): - for arch in ['*'] + self.architectures: + for arch in ['*'] + self.pkglist.filtered_architectures: s = set(without.solved_packages[arch].keys()) s |= set(without.solved_packages['*'].keys()) for p in s: @@ -153,14 +158,18 @@ """ base: list of base groups or None """ solved = dict() - for arch in self.architectures: + for arch in self.pkglist.filtered_architectures: solved[arch] = dict() self.srcpkgs = dict() self.recommends = dict() self.suggested = dict() - for arch in self.architectures: + for arch in self.pkglist.filtered_architectures: pool = self.pkglist._prepare_pool(arch) + solver = pool.Solver() + if ignore_recommended: + solver.set_flag(solver.SOLVER_FLAG_IGNORE_RECOMMENDED, 1) + # pool.set_debuglevel(10) suggested = [] @@ -199,10 +208,6 @@ else: jobs += sel.jobs(solv.Job.SOLVER_INSTALL) - solver = pool.Solver() - if ignore_recommended: - solver.set_flag(solver.SOLVER_FLAG_IGNORE_RECOMMENDED, 1) - problems = solver.solve(jobs) if problems: for problem in problems: @@ -242,8 +247,11 @@ src = s.lookup_str(solv.SOLVABLE_SOURCENAME) self.srcpkgs[src] = group + ':' + s.name + start = time.time() for n, group in self.packages[arch]: solve_one_package(n, group) + end = time.time() + logger.info('%s - solving took %f', self.name, end - start) if include_suggested: seen = set() @@ -256,7 +264,7 @@ common = None # compute common packages across all architectures - for arch in self.architectures: + for arch in self.pkglist.filtered_architectures: if common is None: common = set(solved[arch].keys()) continue @@ -267,7 +275,7 @@ # reduce arch specific set by common ones solved['*'] = dict() - for arch in self.architectures: + for arch in self.pkglist.filtered_architectures: for p in common: solved['*'][p] = solved[arch].pop(p) @@ -278,7 +286,7 @@ if not overlap: return packages = set(self.solved_packages['*']) - for arch in self.architectures: + for arch in self.pkglist.filtered_architectures: packages.update(self.solved_packages[arch]) for m in modules: # do not check with ourselves and only once for the rest @@ -287,7 +295,7 @@ if self.name in m.conflicts or m.name in self.conflicts: continue mp = set(m.solved_packages['*']) - for arch in self.architectures: + for arch in self.pkglist.filtered_architectures: mp.update(m.solved_packages[arch]) if len(packages & mp): overlap.comment += '\n overlapping between ' + self.name + ' and ' + m.name + "\n" @@ -296,12 +304,13 @@ if m.solved_packages[arch].get(p, None): overlap.comment += " # " + m.name + "." + arch + ': ' + m.solved_packages[arch][p] + "\n" if self.solved_packages[arch].get(p, None): - overlap.comment += " # " + self.name + "." + arch + ': ' + self.solved_packages[arch][p] + "\n" + overlap.comment += " # " + self.name + "." + \ + arch + ': ' + self.solved_packages[arch][p] + "\n" overlap.comment += ' - ' + p + "\n" overlap._add_to_packages(p) def collect_devel_packages(self): - for arch in self.architectures: + for arch in self.pkglist.filtered_architectures: pool = self.pkglist._prepare_pool(arch) sel = pool.Selection() for s in pool.solvables_iter(): @@ -320,7 +329,7 @@ for p in pkgdict.keys(): already_present = False for m in modules: - for arch in ['*'] + self.architectures: + for arch in ['*'] + self.pkglist.filtered_architectures: already_present = already_present or (p in m.solved_packages[arch]) if already_present: del pkgdict[p] @@ -330,7 +339,7 @@ self._filter_already_selected(modules, self.suggested) def toxml(self, arch, ignore_broken=False, comment=None): - packages = self.solved_packages[arch] + packages = self.solved_packages.get(arch, dict()) name = self.name if arch != '*': @@ -384,7 +393,7 @@ # just list all packages in it as an array - to be output as one yml def summary(self): ret = set() - for arch in ['*'] + self.architectures: + for arch in ['*'] + self.pkglist.filtered_architectures: ret |= set(self.solved_packages[arch].keys()) return ret @@ -392,7 +401,7 @@ pprint({'name': self.name, 'missing': self.missing, 'packages': self.packages, 'solved': self.solved_packages, 'silents': self.silents}) return - archs = ['*'] + self.architectures + archs = ['*'] + self.pkglist.filtered_architectures for arch in archs: x = self.toxml(arch) print(ET.tostring(x, pretty_print=True)) @@ -511,7 +520,7 @@ def _check_supplements(self): tocheck = set() tocheck_locales = set() - for arch in self.architectures: + for arch in self.filtered_architectures: pool = self._prepare_pool(arch) sel = pool.Selection() for s in pool.solvables_iter(): @@ -595,7 +604,7 @@ unsorted.solved_packages = dict() unsorted.solved_packages['*'] = dict() - for arch in self.architectures: + for arch in self.filtered_architectures: pool = self._prepare_pool(arch) sel = pool.Selection() archpacks = [s.name for s in pool.solvables_iter()] @@ -627,14 +636,14 @@ if unsorted: common = None - for arch in self.architectures: + for arch in self.filtered_architectures: if common is None: common = set(unsorted.solved_packages[arch].keys()) continue common &= set(unsorted.solved_packages[arch].keys()) for p in common: unsorted.solved_packages['*'][p] = None - for arch in self.architectures: + for arch in self.filtered_architectures: del unsorted.solved_packages[arch][p] with open(os.path.join(self.output_dir, 'unsorted.yml'), 'w') as fh: @@ -642,7 +651,7 @@ for p in sorted(packages.keys()): fh.write(" - ") fh.write(p) - if len(packages[p]) != len(self.architectures): + if len(packages[p]) != len(self.filtered_architectures): fh.write(": [") fh.write(','.join(sorted(packages[p]))) fh.write("]") @@ -726,27 +735,41 @@ bs_mirrorfull = os.path.join(SCRIPT_PATH, 'bs_mirrorfull') global_update = False for project, repo in self.repos: - for arch in self.tool.architectures: + for arch in opts.filtered_architectures: # TODO: refactor to common function with repo_checker.py d = os.path.join(CACHEDIR, project, repo, arch) if not os.path.exists(d): os.makedirs(d) + try: + # Fetch state before mirroring in-case it changes during download. + state = repository_arch_state(self.tool.apiurl, project, repo, arch) + except HTTPError: + continue + + # Would be preferable to include hash in name, but cumbersome to handle without + # reworking a fair bit since the state needs to be tracked. + solv_file = os.path.join(CACHEDIR, 'repo-{}-{}-{}.solv'.format(project, repo, arch)) + solv_file_hash = '{}::{}'.format(solv_file, state) + if os.path.exists(solv_file) and os.path.exists(solv_file_hash): + # Solve file exists and hash unchanged, skip updating solv. + logger.debug('skipping solv generation for {} due to matching state {}'.format( + '/'.join([project, repo, arch]), state)) + continue + + # Either hash changed or new, so remove any old hash files. + self.unlink_list(None, glob.glob(solv_file + '::*')) + global_update = True + logger.debug('updating %s', d) args = [bs_mirrorfull] args.append('--nodebug') args.append('{}/public/build/{}/{}/{}'.format(self.tool.apiurl, project, repo, arch)) args.append(d) p = subprocess.Popen(args, stdout=subprocess.PIPE) - repo_update = False for line in p.stdout: logger.info(line.rstrip()) - global_update = True - repo_update = True - solv_file = os.path.join(CACHEDIR, 'repo-{}-{}-{}.solv'.format(project, repo, arch)) - if os.path.exists(solv_file) and not repo_update: - continue files = [os.path.join(d, f) for f in os.listdir(d) if f.endswith('.rpm')] fh = open(solv_file, 'w') @@ -755,6 +778,10 @@ p.communicate('\0'.join(files)) p.wait() fh.close() + + # Create hash file now that solv creation is complete. + open(solv_file_hash, 'a').close() + return global_update def update_merge(self, nonfree): @@ -1062,6 +1089,7 @@ with open(os.path.join(self.tool.input_dir, opts.locales_from), 'r') as fh: root = ET.parse(fh).getroot() self.tool.locales |= set([lang.text for lang in root.findall(".//linguas/language")]) + self.tool.filtered_architectures = opts.filtered_architectures modules = [] # the yml parser makes an array out of everything, so @@ -1090,7 +1118,7 @@ ignores = [x.name for x in overlap.ignored] self.tool.solve_module(overlap.name, [], ignores) overlapped = set(overlap.solved_packages['*']) - for arch in overlap.architectures: + for arch in self.tool.filtered_architectures: overlapped |= set(overlap.solved_packages[arch]) for module in modules: if module.name == 'overlap' or module in overlap.ignored: @@ -1208,6 +1236,12 @@ product = target_config.get('pkglistgen-product', '000product') release = target_config.get('pkglistgen-release', '000release-packages') + opts.filtered_architectures = [] + # make sure we only calculcate existant architectures + for arch in target_archs(api.apiurl, opts.project, main_repo): + if arch in self.options.architectures: + opts.filtered_architectures.append(arch) + url = api.makeurl(['source', opts.project]) packages = ET.parse(http_GET(url)).getroot() if packages.find('entry[@name="{}"]'.format(product)) is None: @@ -1349,12 +1383,18 @@ if api.item_exists(opts.project, '000product-summary'): summary_str = "# Summary of packages in groups" for group in sorted(summary.keys()): + # the unsorted group should appear filtered by + # unneeded.yml - so we need the content of unsorted.yml + # not unsorted.group (this grew a little unnaturally) + if group == 'unsorted': + continue summary_str += "\n" + group + ":\n" for package in sorted(summary[group]): summary_str += " - " + package + "\n" - url = api.makeurl(['source', opts.project, '000product-summary', 'summary.yml']) - http_PUT(url, data=summary_str) + source_file_ensure(api.apiurl, opts.project, '000product-summary', 'summary.yml', summary_str, 'Updating summary.yml') + unsorted_yml = open(os.path.join(product_dir, 'unsorted.yml')).read() + source_file_ensure(api.apiurl, opts.project, '000product-summary', 'unsorted.yml', summary_str, 'Updating unsorted.yml') def solv_cache_update(self, apiurl, cache_dir_solv, target_project, family_last, family_include, opts): """Dump solv files (do_dump_solv) for all products in family.""" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/repo_checker.py new/openSUSE-release-tools-20181004.97e58e1/repo_checker.py --- old/openSUSE-release-tools-20180918.38e2d3f/repo_checker.py 2018-09-18 23:45:12.000000000 +0200 +++ new/openSUSE-release-tools-20181004.97e58e1/repo_checker.py 2018-10-04 11:29:32.000000000 +0200 @@ -494,6 +494,21 @@ return repository + def staging_build_failure_check(self, api, staging): + # This check is only utilize to avoid the case of staging changes after + # a review succeeds and thus does not re-review after the changes needed + # to resolve the build failure are performed. This is one of a variety + # of cases in which this can occur, but rather than fix real issue + # re-instating this to workaround a common case. (see #1712) + + status = api.project_status(staging, True) + # Corrupted requests may reference non-existent projects and will + # thus return a None status which should be considered not ready. + if not status or (str(status['overall_state']) == 'failed' and len(status['broken_packages']) > 0): + return False + + return True + @memoize(ttl=60, session=True) def request_repository_pairs(self, request, action): if str2bool(Config.get(self.apiurl, action.tgt_project).get('repo_checker-project-skip', 'False')): @@ -511,11 +526,16 @@ repository_pairs = [] # Assumes maintenance_release target project has staging disabled. if Config.get(self.apiurl, action.tgt_project).get('staging'): - stage_info = self.staging_api(action.tgt_project).packages_staged.get(action.tgt_package) + api = self.staging_api(action.tgt_project) + stage_info = api.packages_staged.get(action.tgt_package) if not stage_info or str(stage_info['rq_id']) != str(request.reqid): self.logger.info('{} not staged'.format(request.reqid)) return None + if not self.force and not self.staging_build_failure_check(api, stage_info['prj']): + self.logger.info('{} not ready due to staging build failure(s)'.format(request.reqid)) + return None + # Staging setup is convoluted and thus the repository setup does not # contain a path to the target project. Instead the ports repository # is used to import the target prjconf. As such the staging group diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/systemd/osrt-metrics-access.timer new/openSUSE-release-tools-20181004.97e58e1/systemd/osrt-metrics-access.timer --- old/openSUSE-release-tools-20180918.38e2d3f/systemd/osrt-metrics-access.timer 2018-09-18 23:45:12.000000000 +0200 +++ new/openSUSE-release-tools-20181004.97e58e1/systemd/osrt-metrics-access.timer 2018-10-04 11:29:32.000000000 +0200 @@ -6,7 +6,9 @@ # Allow for log rotation to take place on download server. # Skip Monday during which osrt-metrics@.service are run as openSUSE:Factory # takes 5 hours and uses up most of the RAM on machine. -OnCalendar=Tue..Sun *-*-* 4:00:00 +# OnCalendar=Tue..Sun *-*-* 4:00:00 +# TODO Use the above once updated to Leap 15.0 with systemd that supports. +OnCalendar=Tue,Wed,Thu,Fri,Sat,Sun *-*-* 04:00:00 Unit=osrt-metrics-access.service [Install] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/tests/obs.py new/openSUSE-release-tools-20181004.97e58e1/tests/obs.py --- old/openSUSE-release-tools-20180918.38e2d3f/tests/obs.py 2018-09-18 23:45:12.000000000 +0200 +++ new/openSUSE-release-tools-20181004.97e58e1/tests/obs.py 2018-10-04 11:29:32.000000000 +0200 @@ -115,7 +115,7 @@ """Instance constructor.""" self.fixtures = fixtures - CacheManager.directory_test() + CacheManager.test = True Cache.init() Cache.delete_all() httpretty.enable() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openSUSE-release-tools-20180918.38e2d3f/tests/select_tests.py new/openSUSE-release-tools-20181004.97e58e1/tests/select_tests.py --- old/openSUSE-release-tools-20180918.38e2d3f/tests/select_tests.py 2018-09-18 23:45:12.000000000 +0200 +++ new/openSUSE-release-tools-20181004.97e58e1/tests/select_tests.py 2018-10-04 11:29:32.000000000 +0200 @@ -37,7 +37,7 @@ # Only one comment is added self.assertEqual(len(first_select_comments), len(comments) + 1) # With the right content - self.assertTrue('request#123 for package gcc submitted by @Admin' in first_select_comment['comment']) + self.assertTrue('request#123 for package gcc submitted by Admin' in first_select_comment['comment']) # Second select self.assertEqual(True, SelectCommand(self.api, staging_b).perform(['puppet'])) @@ -48,8 +48,8 @@ self.assertEqual(len(second_select_comments) - 1, len(first_select_comments)) self.assertNotEqual(second_select_comment['comment'], first_select_comment['comment']) # The new comments contains new, but not old - self.assertFalse('request#123 for package gcc submitted by @Admin' in second_select_comment['comment']) - self.assertTrue('added request#321 for package puppet submitted by @Admin' in second_select_comment['comment']) + self.assertFalse('request#123 for package gcc submitted by Admin' in second_select_comment['comment']) + self.assertTrue('added request#321 for package puppet submitted by Admin' in second_select_comment['comment']) def test_no_matches(self): # search for requests ++++++ openSUSE-release-tools.obsinfo ++++++ --- /var/tmp/diff_new_pack.xnSUGO/_old 2018-10-04 19:03:02.847105360 +0200 +++ /var/tmp/diff_new_pack.xnSUGO/_new 2018-10-04 19:03:02.847105360 +0200 @@ -1,5 +1,5 @@ name: openSUSE-release-tools -version: 20180918.38e2d3f -mtime: 1537307112 -commit: 38e2d3fa1c5cb72c91686aa91e70d89650fee0f6 +version: 20181004.97e58e1 +mtime: 1538645372 +commit: 97e58e173287133d05b7ad4bcfc451ae679401d1