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
 


Reply via email to