Hello community,

here is the log from the commit of package python3-ipa for openSUSE:Factory 
checked in at 2018-11-13 17:00:30
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python3-ipa (Old)
 and      /work/SRC/openSUSE:Factory/.python3-ipa.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python3-ipa"

Tue Nov 13 17:00:30 2018 rev:9 rq:648462 version:2.3.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python3-ipa/python3-ipa.changes  2018-11-01 
19:13:49.722044613 +0100
+++ /work/SRC/openSUSE:Factory/.python3-ipa.new/python3-ipa.changes     
2018-11-13 17:41:42.088282691 +0100
@@ -1,0 +2,12 @@
+Fri Nov  9 22:59:00 UTC 2018 - Sean Marlow <[email protected]>
+
+- Update to v2.3.0 (2018-11-09)
+  + Move docs to Sphinx.
+  + Update python version support.
+  + Allow ipa to run without config file.
+  + No need for gpg auto import keys.
+  + Add --name option to az creds example.
+  + Explicit validation of GCE region input.
+  + Update license tests for content changes. 
+
+-------------------------------------------------------------------

Old:
----
  python3-ipa-2.2.0.tar.gz

New:
----
  python3-ipa-2.3.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python3-ipa.spec ++++++
--- /var/tmp/diff_new_pack.2O1ml4/_old  2018-11-13 17:41:42.396282265 +0100
+++ /var/tmp/diff_new_pack.2O1ml4/_new  2018-11-13 17:41:42.400282259 +0100
@@ -18,7 +18,7 @@
 
 %bcond_without test
 Name:           python3-ipa
-Version:        2.2.0
+Version:        2.3.0
 Release:        0
 Summary:        Command line and API for testing custom images
 License:        GPL-3.0-or-later

++++++ python3-ipa-2.2.0.tar.gz -> python3-ipa-2.3.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/CHANGES.md 
new/python3-ipa-2.3.0/CHANGES.md
--- old/python3-ipa-2.2.0/CHANGES.md    2018-11-01 00:00:54.000000000 +0100
+++ new/python3-ipa-2.3.0/CHANGES.md    2018-11-09 23:46:28.000000000 +0100
@@ -1,3 +1,21 @@
+v2.3.0 (2018-11-09)
+===================
+
+- Move docs to sphinx.
+  [\#141](https://github.com/SUSE-Enceladus/ipa/pull/141)
+- Update python version support.
+  [\#142](https://github.com/SUSE-Enceladus/ipa/pull/142)
+- Allow ipa to run without config file.
+  [\#137](https://github.com/SUSE-Enceladus/ipa/pull/137)
+- No need for gpg auto import keys.
+  [\#144](https://github.com/SUSE-Enceladus/ipa/pull/144)
+- Add --name option to az creds example.
+  [\#145](https://github.com/SUSE-Enceladus/ipa/pull/145)
+- Explicit validation of GCE region input.
+  [\#146](https://github.com/SUSE-Enceladus/ipa/pull/146)
+- Update license tests for content changes.
+  [\#147](https://github.com/SUSE-Enceladus/ipa/pull/147)
+
 v2.2.0 (2018-10-31)
 ===================
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/PKG-INFO 
new/python3-ipa-2.3.0/PKG-INFO
--- old/python3-ipa-2.2.0/PKG-INFO      2018-11-01 00:07:50.000000000 +0100
+++ new/python3-ipa-2.3.0/PKG-INFO      2018-11-09 23:57:29.000000000 +0100
@@ -1,14 +1,18 @@
 Metadata-Version: 2.1
 Name: python3-ipa
-Version: 2.2.0
+Version: 2.3.0
 Summary: Package for automated testing of cloud images.
 Home-page: https://github.com/SUSE-Enceladus/ipa
 Author: SUSE
 Author-email: [email protected]
 License: GPLv3+
 Description: [![Build 
Status](https://travis-ci.com/SUSE-Enceladus/ipa.svg?branch=master)](https://travis-ci.com/SUSE-Enceladus/ipa)
+        [![Codacy 
Badge](https://api.codacy.com/project/badge/Grade/845fb1620f334ae09488e8137dd6d256)](https://www.codacy.com/app/default-org/ipa?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=SUSE-Enceladus/ipa&amp;utm_campaign=Badge_Grade)
+        [![Documentation 
Status](https://readthedocs.org/projects/ipa/badge/?version=latest)](https://ipa.readthedocs.io/en/latest/?badge=latest)
+        [![Py 
Versions](https://img.shields.io/pypi/pyversions/python3-ipa.svg)](https://pypi.org/project/python3-ipa/)
+        
[![License](https://img.shields.io/pypi/l/python3-ipa.svg)](https://pypi.org/project/python3-ipa/)
         
-        
[![IPA](https://raw.githubusercontent.com/SUSE-Enceladus/ipa/master/docs/assets/images/ipa-logo.png
 "IPA Logo")](https://github.com/SUSE-Enceladus/ipa)
+        
[![IPA](https://raw.githubusercontent.com/SUSE-Enceladus/ipa/master/docs/source/_images/logo.png
 "IPA Logo")](https://github.com/SUSE-Enceladus/ipa)
         
         overview
         ========
@@ -61,7 +65,7 @@
         -   PyYaml
         -   testinfra
         
-        # [Docs](https://suse-enceladus.github.io/ipa/)
+        # [Docs](https://ipa.readthedocs.io/en/latest/)
         
         Tests
         =====
@@ -144,8 +148,9 @@
 Classifier: Programming Language :: Python :: 3.4
 Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
 Requires-Python: >=3.4
 Description-Content-Type: text/markdown
-Provides-Extra: test
-Provides-Extra: dev
 Provides-Extra: tox
+Provides-Extra: dev
+Provides-Extra: test
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/README.md 
new/python3-ipa-2.3.0/README.md
--- old/python3-ipa-2.2.0/README.md     2018-10-31 17:45:00.000000000 +0100
+++ new/python3-ipa-2.3.0/README.md     2018-11-05 16:53:22.000000000 +0100
@@ -1,6 +1,10 @@
 [![Build 
Status](https://travis-ci.com/SUSE-Enceladus/ipa.svg?branch=master)](https://travis-ci.com/SUSE-Enceladus/ipa)
+[![Codacy 
Badge](https://api.codacy.com/project/badge/Grade/845fb1620f334ae09488e8137dd6d256)](https://www.codacy.com/app/default-org/ipa?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=SUSE-Enceladus/ipa&amp;utm_campaign=Badge_Grade)
+[![Documentation 
Status](https://readthedocs.org/projects/ipa/badge/?version=latest)](https://ipa.readthedocs.io/en/latest/?badge=latest)
+[![Py 
Versions](https://img.shields.io/pypi/pyversions/python3-ipa.svg)](https://pypi.org/project/python3-ipa/)
+[![License](https://img.shields.io/pypi/l/python3-ipa.svg)](https://pypi.org/project/python3-ipa/)
 
-[![IPA](https://raw.githubusercontent.com/SUSE-Enceladus/ipa/master/docs/assets/images/ipa-logo.png
 "IPA Logo")](https://github.com/SUSE-Enceladus/ipa)
+[![IPA](https://raw.githubusercontent.com/SUSE-Enceladus/ipa/master/docs/source/_images/logo.png
 "IPA Logo")](https://github.com/SUSE-Enceladus/ipa)
 
 overview
 ========
@@ -53,7 +57,7 @@
 -   PyYaml
 -   testinfra
 
-# [Docs](https://suse-enceladus.github.io/ipa/)
+# [Docs](https://ipa.readthedocs.io/en/latest/)
 
 Tests
 =====
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/docs/index.md 
new/python3-ipa-2.3.0/docs/index.md
--- old/python3-ipa-2.2.0/docs/index.md 2018-10-31 16:39:06.000000000 +0100
+++ new/python3-ipa-2.3.0/docs/index.md 1970-01-01 01:00:00.000000000 +0100
@@ -1,67 +0,0 @@
----
-layout: default
-title: Home
-navigation_weight: 1
----
-
-# IPA
-
-Image Proofing App
-
-## overview
-
-**IPA** provides a command line utility to test images in the Public
-Cloud (AWS, Azure, GCE, etc.).
-
-With **IPA** you can now test custom images in a provider agnostic way
-with one tool and one API. In the first release, **IPA** supports the
-openSUSE and SLES distributions. It also supports the three largest
-cloud providers (AWS, Azure and GCE). However, it is intended to be
-distribution agnostic and framework transparent so both are easily
-extensible.
-
-For each distribution there are specific synchronization points that
-must be provided. These currently include soft reboot and system update.
-The synch points not only test functionality but also act as dividers to
-separate distinct sections of a test suite. For example you can run a
-test to ensure the proper repos exist before and after a system update.
-The system update synch point will guarantee the order of tests.
-Speaking of tests, if you're already familiar with Pytest conventions
-there's no need to learn a whole new unit testing framework. **IPA** is
-written in Python and leverages the Pytest framework through Testinfra.
-
-## Installation
-
-To install the openSUSE package use the following commands as root:
-
-```shell
-$ zypper ar 
http://download.opensuse.org/repositories/Cloud:/Tools/<distribution>
-$ zypper refresh
-$ zypper in python3-ipa
-```
-   
-From PyPI:
-
-```shell
-$ pip install python3-ipa
-```
-
-Or you can install the latest development version from github:
-
-```shell
-# latest source
-$ pip install git+https://github.com/SUSE-Enceladus/ipa.git
-
-# specific branch or release
-$ pip install git+https://github.com/SUSE-Enceladus/ipa.git@{branch/release}
-```
-
-See [PyPi
-docs](https://pip.pypa.io/en/stable/reference/pip_install/#vcs-support)
-for more information on vcs support.
-
-## Contents
-
--   [Getting Started](start.md)
--   [Writing Tests](tests.md)
--   [Source Overview](source.md)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/docs/source.md 
new/python3-ipa-2.3.0/docs/source.md
--- old/python3-ipa-2.2.0/docs/source.md        2018-10-31 16:39:06.000000000 
+0100
+++ new/python3-ipa-2.3.0/docs/source.md        1970-01-01 01:00:00.000000000 
+0100
@@ -1,108 +0,0 @@
----
-layout: default
-title: Source
-navigation_weight: 3
----
-
-CLI
-===
-
-## ipa test
-
-The test subcommand invokes a test suite on an image in the chosen
-public cloud environment. The image id, tests and provider are required
-arguments. See below for options:
-
-```shell
-$ ipa test --ssh-private-key /path/to/key -d SLES azure test_image
-```
-
-## ipa results
-
-The results subcommand displays the test results information. The path
-to the results xml is required.
-
-```shell
-$ ipa results -v
-```
-
-The default location for results files is \~/ipa/results/ and the files
-are encoded with the timestamp of execution. For example, the results
-for an image test in ec2 would be found at
-\~/ipa/results/ec2/{imageId}/{instanceId}/{datetime}.results.
-
-**Example results directory:**
-    
-    ec2/:
-      ami-43243232/:
-        i-3432r4324y3t2/:
-          {datetime}.results
-        i-432423j3j2432/:
-          {datetime}.results
-
-## ipa list
-
-The list subcommand displays the available tests.
-
-```shell
-$ ipa list
-test_broken
-test_image
-test_sles
-```
-
-The list subcommand will return a list of test files in the default test
-directories. The verbose option will return a list of all available
-tests in all test files.
-
-```shell
-$ ipa list -v
-test_broken::test_broken
-test_image::test_image
-test_sles::test_sles
-test_sles::test_sles_1
-test_sles::test_sles_2
-```
-
-API
-===
-
-The API used by CLI or used independently, is structured with a base
-class in ipa\_provider.py. This contains the functionality required to
-run tests and collect the test results.
-
-**ipa\_provider.py.**
-
-```python
-class IpaProvider(object):
-...
-```
-
-The base class is extended for each provider to implement specific
-methods for manipulating the test instance.
-
-**ipa\_{cloud-provider}.py.**
-
-```python
-class {CloudProvider}Provider(IpaProvider):
-...
-```
-
-The controller (ipa\_controller.py) provides methods for testing an
-image, displaying available tests and/or test files and displaying
-results of a previous test run. These methods provide a layer between
-the CLI and the API. They also provide an entry point for using **ipa**
-directly from code.
-
-**ipa\_controller.py.**
-
-```python
-def test_image(self):
-    """Creates a cloud provider instance and initiates testing."""
-
-def list_tests(self):
-    """Returns a list of test files and/or tests."""
-
-def collect_results(self):
-    """Returns the result (pass/fail) or verbose results."""
-```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/docs/start.md 
new/python3-ipa-2.3.0/docs/start.md
--- old/python3-ipa-2.2.0/docs/start.md 2018-10-31 16:39:06.000000000 +0100
+++ new/python3-ipa-2.3.0/docs/start.md 1970-01-01 01:00:00.000000000 +0100
@@ -1,331 +0,0 @@
----
-layout: default
-title: Overview
-navigation_weight: 2
----
-
-Requirements
-============
-
-- apache-libcloud
-- azure-common
-- azure-mgmt-compute
-- azure-mgmt-network
-- azure-mgmt-resource
-- certifi
-- Click
-- cryptography
-- paramiko
-- pycryptodome
-- pytest
-- PyYaml
-- testinfra
-
-Installation
-============
-
-To install the openSUSE package use the following commands as root:
-
-```shell
-$ zypper ar 
http://download.opensuse.org/repositories/Cloud:/Tools/<distribution>
-$ zypper refresh
-$ zypper in python3-ipa
-```
-   
-From PyPI:
-
-```shell
-$ pip install python3-ipa
-```
-
-Or you can install the latest development version from github:
-
-```shell
-# latest source
-$ pip install git+https://github.com/SUSE-Enceladus/ipa.git
-
-# specific branch or release
-$ pip install git+https://github.com/SUSE-Enceladus/ipa.git@{branch/release}
-```
-
-See [PyPi
-docs](https://pip.pypa.io/en/stable/reference/pip_install/#vcs-support)
-for more information on vcs support.
-
-Configuration
-=============
-
-The framework configuration file is ini format \~/.config/ipa/config.
-Anything specific to the test framework can be found in this file. Thus
-anything that is cloud framework independent such as the tests dir and
-results dir.
-
-To override the default configuration location the CLI option `-C` or
-`--config` is provided.
-
-The following is an example configuration file. The ipa section is
-required and the provider sections are optional and can be \[ec2\],
-\[gce\], \[azure\] or \[ssh\].
-
-```ini
-[ipa]
-tests=~/ipa/tests/
-results=~/ipa/results/
-
-[ec2]
-region=us-west-1
-```
-
-Azure
------
-
-Azure uses service principals for authentication. See [Azure
-docs](https://docs.microsoft.com/en-us/python/azure/python-sdk-azure-authenticate?view=azure-python#mgmt-auth-file)
-for more info on creating a service principal json file. Additional
-configuration options can be placed in the `azure` section of the `ipa`
-configuration file.
-
-EC2
----
-
-For testing EC2 instances **ipa** will use the ec2utils configuration
-file located at \~/.ec2utils.conf. See
-[ec2utils](https://github.com/SUSE-Enceladus/Enceladus/tree/master/ec2utils) 
for
-an example configuration file.
-
-GCE
----
-
-GCE uses service accounts for authentication. The service account is
-required to have the following:
-
-- Compute Instance Admin (v1) Role
-  
([roles/compute.instanceAdmin.v1](https://cloud.google.com/compute/docs/access/iam))
-- Service Account User Role
-  
([roles/iam.serviceAccountUser](https://cloud.google.com/compute/docs/access/iam))
-- Private key (JSON format)
-    - Save this file in a secure location as it cannot be recovered.
-
-The path to the JSON private key can be added to IPA configuration:
-
-**example.ipa.config.**
-
-```ini
-[ipa]
-
-[gce]
-service_account_file = /path/to/service-account.json
-```
-
-> Additional configuration options can be placed in the `gce` section of
-> the `ipa` configuration file.
-
-To create a service account and generate the proper JSON file follow the
-[Libcloud
-docs](http://libcloud.readthedocs.io/en/latest/compute/drivers/gce.html#service-account)
-or [Google
-docs](https://cloud.google.com/iam/docs/creating-managing-service-accounts).
-
-For more information on updating an existing service account:
-
-- Create a new JSON private key:
-  
[creating-managing-service-account-keys](https://cloud.google.com/iam/docs/creating-managing-service-account-keys)
-- Granting roles:
-  
[granting-roles-to-service-accounts](https://cloud.google.com/iam/docs/granting-roles-to-service-accounts)
-
-SSH
----
-Requires no provider credentials to test instances. SSH user, SSH private key 
can
-be placed in ssh section of config. The instance to be tested must be running.
-
-Provider Configuration location
--------------------------------
-
-To override the provider configuration the CLI option,
-`--provider-config` is available.
-
-Usage
-=====
-
-CLI
----
-
-```shell
-$ ipa test
-```
-
-Test image in the given framework using the supplied test files.
-
-#### Testing an image in EC2
-
-```shell
-$ ipa test -i {image-id} \
-  -a {account} \
-  --provider-config ~/.ec2utils.conf \
-  --no-cleanup \
-  -d openSUSE_Leap \
-  ec2 test_image
-
-Starting instance
-Running tests /home/{user}/ipa/tests/test_image.py
-PASSED tests=1|pass=1|fail=0|error=0
-```
-
-#### Testing an image in Azure
-
-```shell
-$ ipa test -i {image-id} \
-  --no-cleanup \
-  -d openSUSE_Leap \
-  --ssh-private-key {azure-ssh-key-file} \
-  azure test_image
-
-Starting instance
-Running tests /home/{user}/ipa/tests/test_image.py
-PASSED tests=1|pass=1|fail=0|error=0
-```
-
-#### Testing an image in GCE
-
-```shell
-$ ipa test -i {image-id} \
-  --no-cleanup \
-  -d openSUSE_Leap \
-  gce test_image
-
-Starting instance
-Running tests /home/{user}/ipa/tests/test_image.py
-PASSED tests=1|pass=1|fail=0|error=0
-```
-
-#### Testing an image in SSH
-
-```shell
-$ ipa test -ip-address 10.0.0.1 \
-  -d openSUSE_Leap \
-  ssh test_image
-
-Running tests /home/{user}/ipa/tests/test_image.py
-PASSED tests=1|pass=1|fail=0|error=0
-```
-
-### Verbosity
-
-The CLI output verbosity can be controlled via options:
-
-`--debug`
-
-Display debug level logging to console.
-
-`--verbose`
-
-(Default) Display logging info to console.
-
-`--quiet`
-
-Silence logging information on test run.
-
-### Cleanup
-
-By default the instance will be terminated if all tests pass. If a test
-fails the instance will remain running. This behavior can be changed
-with the `--cleanup` and `--no-cleanup` flags.
-
-`--cleanup`
-
-Instance will be terminated in all cases.
-
-`--no-cleanup`
-
-Instance will remain running in all cases.
-
-### ANSI Style
-
-By default the command line output will be colored. To disable color
-output use the `--no-color` option.
-
-### Early Exit
-
-The early exit option will stop the test run on the first failure.
-`--early-exit` is passed to Pytest as `-x`. See [Pytest
-docs](https://docs.pytest.org/en/latest/usage.html#stopping-after-the-first-or-n-failures)
-for more info.
-
-### Requirements and external test injection
-
-Using the `--inject` option; packages, archives and files can be
-injected on the test instance. This also provides the ability to install
-packages in an existing repository and run commands on the test
-instance. The following sections may be provided in a YAML style config
-file. Each section can be a single item or a list of items. All files
-are copied and extracted to the default SSH location for the test
-instance. This is generally the user's home directory.
-
-***inject\_packages***
-
-an rpm path or list of rpm paths which will be copied and installed
-on the test instance.
-
-***inject\_archives***
-
-an archive or list of archives which will be copied and extracted on
-the test instance.
-
-***inject\_files***
-
-a file path or list of file paths which will be copied to the test
-instance.
-
-***execute***
-
-a command or list of commands to run on the test instance.
-
-***install***
-
-a package name or list of package names to install from an existing
-repo on the test instance.
-
-The order of processing for the sections is as follows:
-
-1.  inject\_packages
-2.  inject\_archives
-3.  inject\_files
-4.  execute
-5.  install
-
-#### Example
-
-**testing\_injection.yaml.**
-
-```yaml
-inject_packages: /home/user/test.noarch.rpm
-inject_archives: /home/user/test.tar.xz
-inject_files: /home/user/test.py
-install:
-  - python3
-  - python3-Django
-execute: python test.py
-```
-
-```shell
-$ ipa test ... --inject testing_injection.yaml
-```
-
-Code
-----
-
-**ipa** primarily provides a CLI tool for testing images. However, the
-endpoints can be imported directly in Python 3 code through the
-controller.
-
-```python
-from ipa.ipa_controller import test_image
-
-status, results = test_image(
-    provider,
-    access_key_id,
-    ...
-    storage_container,
-    tests
-)
-```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/docs/tests.md 
new/python3-ipa-2.3.0/docs/tests.md
--- old/python3-ipa-2.2.0/docs/tests.md 2018-10-31 16:39:06.000000000 +0100
+++ new/python3-ipa-2.3.0/docs/tests.md 1970-01-01 01:00:00.000000000 +0100
@@ -1,145 +0,0 @@
----
-layout: default
-title: Tests
-navigation_weight: 4
----
-
-Tests are developed using the
-[Testinfra](https://testinfra.readthedocs.io) package. The package
-extends Pytest and provides a framework for writing Python tests to
-verify the actual state of systems.
-
-Test directories
-================
-
-The default locations for test files are locally in \~/ipa/tests/ and
-centralized in /usr/share/ipa/tests. These locations can be overridden
-in the config and/or command line arguments.
-
-Test organization
-=================
-
-Tests can be organized in a directory structure:
-
-    ~/ipa/tests/:
-      conftest.py
-      test_image.py
-      openSUSE:
-        test_leap.py
-        EC2:
-          test_leap_ec2.py
-        GCE:
-        ...
-      SLES:
-        test_sles.py
-        test_sles_sap.py
-        EC2:
-          test_sles_ec2.py
-        ...
-
-Additionally, test descriptions in YAML format can be used to organize
-tests:
-
-**test\_leap\_423.yaml.**
-
-```yaml
-tests:
-  - test_image
-  - test_leap
-```
-
-Adding tests to command line args you simply drop the extension:
-
-```shell
-$ ipa test ... test_leap_423
-```
-
-This means there cannot be a name overlap with test files and/or test
-descriptions.
-
-Test descriptions can also include other descriptions:
-
-**test\_leap\_423.yaml.**
-
-```yaml
-tests:
-  - ...
-include:
-  - test_another_description
-```
-
-Test invocation
-===============
-
-To invoke a specific test the Pytest conventions can be used:
-
-    test_leap_ec2::test-services-running-enabled
-
-To run only one parameterized test append ids and use \[ID\]:
-
-**test\_leap\_ec2.py.**
-
-```python
[email protected]("name", [
-    ("cloud-init"),
-    ("amazon-ssm-agent"),
-], ids=['ci', 'ssm'])
-def test_leap_ec2():
-  ...
-```
-
-```shell
-$ ipa test ... test_leap_ec2::test-services-running-enabled[ssm]
-```
-
-Failures
---------
-
-By default all tests will run even with failure. Using the
-`--early-exit` option will halt test invocation at first failure.
-
-[Incremental test
-classes](http://pytest.org/dev/example/simple.html#incremental-testing-test-steps)
-can be used to cause all subsequent tests to fail if the prev fails. To
-prevent expected failures.
-
-Custom Test Modules
-===================
-
-[Modules](http://testinfra.readthedocs.io/en/latest/modules.html) are
-provided for checking standard things such as packages, services, files,
-etc.
-
-Modules can be easily written or extended from using [Pytest
-fixtures](https://docs.pytest.org/en/latest/fixture.html). Any custom
-modules reside in the conftest.py file inside the test directory:
-
-**conftest.py.**
-
-```python
-import pytest
-
[email protected]()
-def Echo(Command):
-    def f(arg):
-        return Command.check-output("echo %s", arg)
-    return f
-
-
[email protected]()
-def CheckRepo(File):
-    def f(repo, name):
-        repo = File('/etc/zypp/repos.d/' + repo + '.repo')
-        tests = [repo.exists,
-                 repo.contains('enabled=1'),
-                 repo.contains('name=%s' % name)]
-        return all(tests)
-    return f
-```
-
-Useful Links
-============
-
-For more info on writing tests see the
-[Testinfra](http://testinfra.readthedocs.io/en/latest/) and
-[Pytest](https://docs.pytest.org/en/latest/contents.html) documentation.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/ipa/__init__.py 
new/python3-ipa-2.3.0/ipa/__init__.py
--- old/python3-ipa-2.2.0/ipa/__init__.py       2018-11-01 00:01:27.000000000 
+0100
+++ new/python3-ipa-2.3.0/ipa/__init__.py       2018-11-09 23:53:51.000000000 
+0100
@@ -22,4 +22,4 @@
 
 __author__ = """SUSE"""
 __email__ = '[email protected]'
-__version__ = '2.2.0'
+__version__ = '2.3.0'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/ipa/ipa_gce.py 
new/python3-ipa-2.3.0/ipa/ipa_gce.py
--- old/python3-ipa-2.2.0/ipa/ipa_gce.py        2018-10-31 16:10:33.000000000 
+0100
+++ new/python3-ipa-2.3.0/ipa/ipa_gce.py        2018-11-08 03:14:51.000000000 
+0100
@@ -132,6 +132,8 @@
         self._get_service_account_info()
         self.compute_driver = self._get_driver()
 
+        self._validate_region()
+
     def _get_service_account_info(self):
         """Retrieve json dict from service account file."""
         with open(self.service_account_file, 'r') as f:
@@ -206,12 +208,6 @@
 
     def _launch_instance(self):
         """Launch an instance of the given image."""
-        if not self.region:
-            raise GCEProviderException(
-                'Zone is required to launch a new GCE instance. '
-                'Example: us-west1-a'
-            )
-
         metadata = {'key': 'ssh-keys', 'value': self.ssh_public_key}
         self.running_instance_id = ipa_utils.generate_instance_name(
             'gce-ipa-test'
@@ -258,3 +254,24 @@
         """If existing image used get image id."""
         instance = self._get_instance()
         self.image_id = instance.image
+
+    def _validate_region(self):
+        """Validate region was passed in and is a valid GCE zone."""
+        if not self.region:
+            raise GCEProviderException(
+                'Zone is required for GCE provider: '
+                'Example: us-west1-a'
+            )
+
+        try:
+            zone = self.compute_driver.ex_get_zone(self.region)
+        except Exception:
+            zone = None
+
+        if not zone:
+            raise GCEProviderException(
+                '{region} is not a valid GCE zone. '
+                'Example: us-west1-a'.format(
+                    region=self.region
+                )
+            )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/ipa/ipa_opensuse_leap.py 
new/python3-ipa-2.3.0/ipa/ipa_opensuse_leap.py
--- old/python3-ipa-2.2.0/ipa/ipa_opensuse_leap.py      2018-10-31 
16:10:33.000000000 +0100
+++ new/python3-ipa-2.3.0/ipa/ipa_opensuse_leap.py      2018-11-08 
03:14:51.000000000 +0100
@@ -2,7 +2,7 @@
 
 """openSUSE Leap distro module and sync points."""
 
-# Copyright (c) 2017 SUSE LLC
+# Copyright (c) 2018 SUSE LLC
 #
 # This file is part of ipa. Ipa provides an api and command line
 # utilities for testing images in the Public Cloud.
@@ -25,7 +25,3 @@
 
 class openSUSE_Leap(SLES):
     """openSUSE Leap distro class."""
-
-    def get_refresh_repo_cmd(self):
-        """Return refresh repo command for SLES."""
-        return 'zypper -n --gpg-auto-import-keys refresh'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/ipa/ipa_provider.py 
new/python3-ipa-2.3.0/ipa/ipa_provider.py
--- old/python3-ipa-2.2.0/ipa/ipa_provider.py   2018-10-31 16:10:33.000000000 
+0100
+++ new/python3-ipa-2.3.0/ipa/ipa_provider.py   2018-11-05 21:28:17.000000000 
+0100
@@ -42,6 +42,7 @@
 from ipa.ipa_opensuse_leap import openSUSE_Leap
 from ipa.ipa_sles import SLES
 from ipa.ipa_exceptions import (
+    IpaException,
     IpaProviderException,
     IpaSSHException,
     IpaUtilsException
@@ -92,8 +93,13 @@
 
         # Get ipa ini config file
         self.config = config or IPA_CONFIG_FILE
-        self.ipa_config = ipa_utils.get_config(self.config)
-        self.logger.debug('Using ipa config file: %s' % self.config)
+
+        try:
+            self.ipa_config = ipa_utils.get_config(self.config)
+            self.logger.debug('Using ipa config file: %s' % self.config)
+        except IpaException:
+            self.ipa_config = None
+            self.logger.debug('IPA config file not found: %s' % self.config)
 
         self.description = description
         self.host_key_fingerprint = None
@@ -185,7 +191,7 @@
         if arg or arg is False:
             value = arg
 
-        elif config_key:
+        elif config_key and self.ipa_config:
             with ipa_utils.ignored(IpaUtilsException):
                 value = ipa_utils.get_from_config(
                     self.ipa_config,
@@ -254,16 +260,17 @@
             self.test_dirs.update(test_dirs.split(','))
 
         with ipa_utils.ignored(IpaUtilsException):
-            # ipa config arg
-            test_dirs = ipa_utils.get_from_config(
-                self.ipa_config,
-                self.provider,
-                'ipa',
-                'test_dirs'
-            )
+            if self.ipa_config:
+                # ipa config arg
+                test_dirs = ipa_utils.get_from_config(
+                    self.ipa_config,
+                    self.provider,
+                    'ipa',
+                    'test_dirs'
+                )
 
-            if test_dirs:
-                self.test_dirs.update(test_dirs.split(','))
+                if test_dirs:
+                    self.test_dirs.update(test_dirs.split(','))
 
         if not no_default_test_dirs:
             self.test_dirs.update(TEST_PATHS)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/package/python3-ipa.spec 
new/python3-ipa-2.3.0/package/python3-ipa.spec
--- old/python3-ipa-2.2.0/package/python3-ipa.spec      2018-11-01 
00:01:27.000000000 +0100
+++ new/python3-ipa-2.3.0/package/python3-ipa.spec      2018-11-09 
23:53:51.000000000 +0100
@@ -18,7 +18,7 @@
 
 %bcond_without test
 Name:           python3-ipa
-Version:        2.2.0
+Version:        2.3.0
 Release:        0
 Summary:        Command line and API for testing custom images
 License:        GPL-3.0-or-later
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/python3_ipa.egg-info/PKG-INFO 
new/python3-ipa-2.3.0/python3_ipa.egg-info/PKG-INFO
--- old/python3-ipa-2.2.0/python3_ipa.egg-info/PKG-INFO 2018-11-01 
00:07:50.000000000 +0100
+++ new/python3-ipa-2.3.0/python3_ipa.egg-info/PKG-INFO 2018-11-09 
23:57:29.000000000 +0100
@@ -1,14 +1,18 @@
 Metadata-Version: 2.1
 Name: python3-ipa
-Version: 2.2.0
+Version: 2.3.0
 Summary: Package for automated testing of cloud images.
 Home-page: https://github.com/SUSE-Enceladus/ipa
 Author: SUSE
 Author-email: [email protected]
 License: GPLv3+
 Description: [![Build 
Status](https://travis-ci.com/SUSE-Enceladus/ipa.svg?branch=master)](https://travis-ci.com/SUSE-Enceladus/ipa)
+        [![Codacy 
Badge](https://api.codacy.com/project/badge/Grade/845fb1620f334ae09488e8137dd6d256)](https://www.codacy.com/app/default-org/ipa?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=SUSE-Enceladus/ipa&amp;utm_campaign=Badge_Grade)
+        [![Documentation 
Status](https://readthedocs.org/projects/ipa/badge/?version=latest)](https://ipa.readthedocs.io/en/latest/?badge=latest)
+        [![Py 
Versions](https://img.shields.io/pypi/pyversions/python3-ipa.svg)](https://pypi.org/project/python3-ipa/)
+        
[![License](https://img.shields.io/pypi/l/python3-ipa.svg)](https://pypi.org/project/python3-ipa/)
         
-        
[![IPA](https://raw.githubusercontent.com/SUSE-Enceladus/ipa/master/docs/assets/images/ipa-logo.png
 "IPA Logo")](https://github.com/SUSE-Enceladus/ipa)
+        
[![IPA](https://raw.githubusercontent.com/SUSE-Enceladus/ipa/master/docs/source/_images/logo.png
 "IPA Logo")](https://github.com/SUSE-Enceladus/ipa)
         
         overview
         ========
@@ -61,7 +65,7 @@
         -   PyYaml
         -   testinfra
         
-        # [Docs](https://suse-enceladus.github.io/ipa/)
+        # [Docs](https://ipa.readthedocs.io/en/latest/)
         
         Tests
         =====
@@ -144,8 +148,9 @@
 Classifier: Programming Language :: Python :: 3.4
 Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
 Requires-Python: >=3.4
 Description-Content-Type: text/markdown
-Provides-Extra: test
-Provides-Extra: dev
 Provides-Extra: tox
+Provides-Extra: dev
+Provides-Extra: test
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/python3_ipa.egg-info/SOURCES.txt 
new/python3-ipa-2.3.0/python3_ipa.egg-info/SOURCES.txt
--- old/python3-ipa-2.2.0/python3_ipa.egg-info/SOURCES.txt      2018-11-01 
00:07:50.000000000 +0100
+++ new/python3-ipa-2.3.0/python3_ipa.egg-info/SOURCES.txt      2018-11-09 
23:57:29.000000000 +0100
@@ -10,10 +10,6 @@
 setup.cfg
 setup.py
 tox.ini
-docs/index.md
-docs/source.md
-docs/start.md
-docs/tests.md
 ipa/__init__.py
 ipa/collect_items.py
 ipa/ipa_azure.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/python3_ipa.egg-info/requires.txt 
new/python3-ipa-2.3.0/python3_ipa.egg-info/requires.txt
--- old/python3-ipa-2.2.0/python3_ipa.egg-info/requires.txt     2018-11-01 
00:07:50.000000000 +0100
+++ new/python3-ipa-2.3.0/python3_ipa.egg-info/requires.txt     2018-11-09 
23:57:29.000000000 +0100
@@ -18,6 +18,8 @@
 pytest-cov
 bumpversion
 pip>=7.0.0
+Sphinx
+sphinx-click
 
 [test]
 coverage
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/requirements-dev.txt 
new/python3-ipa-2.3.0/requirements-dev.txt
--- old/python3-ipa-2.2.0/requirements-dev.txt  2018-10-31 16:39:06.000000000 
+0100
+++ new/python3-ipa-2.3.0/requirements-dev.txt  2018-11-05 16:16:29.000000000 
+0100
@@ -2,3 +2,5 @@
 
 bumpversion
 pip>=7.0.0
+Sphinx
+sphinx-click
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/setup.cfg 
new/python3-ipa-2.3.0/setup.cfg
--- old/python3-ipa-2.2.0/setup.cfg     2018-11-01 00:07:50.000000000 +0100
+++ new/python3-ipa-2.3.0/setup.cfg     2018-11-09 23:57:29.000000000 +0100
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 2.2.0
+current_version = 2.3.0
 commit = True
 tag = False
 
@@ -7,6 +7,8 @@
 
 [bumpversion:file:ipa/__init__.py]
 
+[bumpversion:file:docs/source/conf.py]
+
 [bumpversion:file:package/python3-ipa.spec]
 
 [tool:pytest]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/setup.py 
new/python3-ipa-2.3.0/setup.py
--- old/python3-ipa-2.2.0/setup.py      2018-11-01 00:01:27.000000000 +0100
+++ new/python3-ipa-2.3.0/setup.py      2018-11-09 23:53:51.000000000 +0100
@@ -43,7 +43,7 @@
 
 setup(
     name='python3-ipa',
-    version='2.2.0',
+    version='2.3.0',
     description="Package for automated testing of cloud images.",
     long_description=readme,
     long_description_content_type="text/markdown",
@@ -81,5 +81,6 @@
         'Programming Language :: Python :: 3.4',
         'Programming Language :: Python :: 3.5',
         'Programming Language :: Python :: 3.6',
+        'Programming Language :: Python :: 3.7',
     ],
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python3-ipa-2.2.0/tests/test_ipa_gce.py 
new/python3-ipa-2.3.0/tests/test_ipa_gce.py
--- old/python3-ipa-2.2.0/tests/test_ipa_gce.py 2018-10-31 16:10:33.000000000 
+0100
+++ new/python3-ipa-2.3.0/tests/test_ipa_gce.py 2018-11-08 03:14:51.000000000 
+0100
@@ -69,11 +69,13 @@
 
         self.kwargs['ssh_private_key_file'] = 'tests/data/ida_test'
 
+    @patch.object(GCEProvider, '_validate_region')
     @patch.object(GCEProvider, '_get_ssh_public_key')
     @patch.object(GCEProvider, '_get_driver')
     def test_gce_get_service_account_info(self,
                                           mock_get_driver,
-                                          mock_get_ssh_key):
+                                          mock_get_ssh_key,
+                                          mock_validate_region):
         """Test get service account info method."""
         mock_get_driver.return_value = None
         mock_get_ssh_key.return_value = None
@@ -85,12 +87,14 @@
             '[email protected]'
         assert provider.service_account_project == 'test'
 
+    @patch.object(GCEProvider, '_validate_region')
     @patch.object(GCEProvider, '_get_ssh_public_key')
     @patch.object(GCEProvider, '_get_driver')
     def test_gce_get_service_account_info_invalid(
         self,
         mock_get_driver,
-        mock_get_ssh_key
+        mock_get_ssh_key,
+        mock_validate_region
     ):
         """Test get service account info method."""
         mock_get_driver.return_value = None
@@ -108,11 +112,13 @@
             'docs for information on GCE configuration.'
         assert str(error.value) == msg
 
+    @patch.object(GCEProvider, '_validate_region')
     @patch.object(GCEProvider, '_get_ssh_public_key')
     @patch('libcloud.compute.drivers.gce.GCENodeDriver')
     def test_gce_get_driver(self,
                             mock_node_driver,
-                            mock_get_ssh_key):
+                            mock_get_ssh_key,
+                            mock_validate_region):
         """Test gce get driver method."""
         driver = MagicMock()
 
@@ -122,11 +128,13 @@
         provider = GCEProvider(**self.kwargs)
         assert driver == provider.compute_driver
 
+    @patch.object(GCEProvider, '_validate_region')
     @patch.object(GCEProvider, '_get_ssh_public_key')
     @patch.object(GCEProvider, '_get_driver')
     def test_gce_get_instance(self,
                               mock_get_driver,
-                              mock_get_ssh_key):
+                              mock_get_ssh_key,
+                              mock_validate_region):
         """Test gce get instance method."""
         instance = MagicMock()
         driver = MagicMock()
@@ -154,16 +162,26 @@
         assert str(error.value) == "Instance with id: test-instance cannot" \
             " be found: 'Broken'"
 
+    @patch.object(GCEProvider, '_validate_region')
     @patch.object(GCEProvider, '_get_driver')
-    def test_gce_get_ssh_public_key(self, mock_get_driver):
+    def test_gce_get_ssh_public_key(
+        self,
+        mock_get_driver,
+        mock_validate_region
+    ):
         """Test GCE get instance method."""
         mock_get_driver.return_value = None
 
         provider = GCEProvider(**self.kwargs)
         assert provider.ssh_public_key
 
+    @patch.object(GCEProvider, '_validate_region')
     @patch.object(GCEProvider, '_get_driver')
-    def test_gce_get_subnet(self, mock_get_driver):
+    def test_gce_get_subnet(
+        self,
+        mock_get_driver,
+        mock_validate_region
+    ):
         """Test GCE get subnetwork method."""
         subnetwork = MagicMock()
         driver = MagicMock()
@@ -176,8 +194,13 @@
 
         assert result == subnetwork
 
+    @patch.object(GCEProvider, '_validate_region')
     @patch.object(GCEProvider, '_get_driver')
-    def test_gce_get_subnet_exception(self, mock_get_driver):
+    def test_gce_get_subnet_exception(
+        self,
+        mock_get_driver,
+        mock_validate_region
+    ):
         """Test GCE get subnetwork method."""
         driver = MagicMock()
         driver.ex_get_subnetwork.side_effect = Exception('Cannot find subnet!')
@@ -192,13 +215,15 @@
 
         assert msg == str(error.value)
 
+    @patch.object(GCEProvider, '_validate_region')
     @patch.object(GCEProvider, '_get_subnet')
     @patch('ipa.ipa_utils.generate_instance_name')
     @patch.object(GCEProvider, '_get_driver')
     def test_gce_launch_instance(self,
                                  mock_get_driver,
                                  mock_generate_instance_name,
-                                 mock_get_subnet):
+                                 mock_get_subnet,
+                                 mock_validate_region):
         """Test GCE launch instance method."""
         driver = MagicMock()
         instance = MagicMock()
@@ -209,14 +234,6 @@
         mock_generate_instance_name.return_value = 'test-instance'
 
         provider = GCEProvider(**self.kwargs)
-        provider.region = None
-
-        with pytest.raises(GCEProviderException) as error:
-            provider._launch_instance()
-
-        assert str(error.value) == \
-            'Zone is required to launch a new GCE instance. ' \
-            'Example: us-west1-a'
 
         provider.region = 'us-west1-a'
         provider.subnet_id = 'test-subnet'
@@ -230,13 +247,15 @@
 
         assert provider.running_instance_id == 'test-instance'
 
+    @patch.object(GCEProvider, '_validate_region')
     @patch.object(GCEProvider, '_get_ssh_public_key')
     @patch.object(GCEProvider, '_get_driver')
     @patch.object(GCEProvider, '_get_instance')
     def test_gce_set_image_id(self,
                               mock_get_instance,
                               mock_get_driver,
-                              mock_get_ssh_key):
+                              mock_get_ssh_key,
+                              mock_validate_region):
         """Test ec2 provider set image id method."""
         instance = MagicMock()
         instance.image = 'test-image'
@@ -249,3 +268,26 @@
 
         assert provider.image_id == instance.image
         assert mock_get_instance.call_count == 1
+
+    @patch.object(GCEProvider, '_get_driver')
+    def test_gce_validate_region(self, mock_get_driver):
+        """Test ec2 provider set image id method."""
+        driver = MagicMock()
+        driver.ex_get_zone.return_value = None
+        mock_get_driver.return_value = driver
+
+        with pytest.raises(GCEProviderException) as error:
+            GCEProvider(**self.kwargs)
+
+        assert str(error.value) == \
+            'Zone is required for GCE provider: Example: us-west1-a'
+
+        self.kwargs['region'] = 'fake'
+
+        with pytest.raises(GCEProviderException) as error:
+            GCEProvider(**self.kwargs)
+
+        driver.ex_get_zone.assert_called_once_with('fake')
+
+        assert str(error.value) == \
+            'fake is not a valid GCE zone. Example: us-west1-a'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python3-ipa-2.2.0/usr/share/lib/ipa/tests/SLES/SAP/test_sles_sap_license.py 
new/python3-ipa-2.3.0/usr/share/lib/ipa/tests/SLES/SAP/test_sles_sap_license.py
--- 
old/python3-ipa-2.2.0/usr/share/lib/ipa/tests/SLES/SAP/test_sles_sap_license.py 
    2018-10-31 16:10:33.000000000 +0100
+++ 
new/python3-ipa-2.3.0/usr/share/lib/ipa/tests/SLES/SAP/test_sles_sap_license.py 
    2018-11-09 17:57:12.000000000 +0100
@@ -1,26 +1,23 @@
-def test_sles_sap_license(host):
-    license_dir = '/etc/YaST2/licenses/ha'
-    license_content = 'SUSE End User License Agreement'
+import pytest
 
-    lic_dir = host.file(license_dir)
 
-    try:
-        assert lic_dir.exists
-        assert lic_dir.is_directory
-    except AssertionError:
-        # SLE15 dir changed
-        license_dir = '/etc/YaST2/licenses/SLES_SAP'
-        lic_dir = host.file(license_dir)
-        assert lic_dir.exists
-        assert lic_dir.is_directory
+def test_sles_sap_license(
+    host, confirm_sles_license_content, get_release_value
+):
+    version = get_release_value('VERSION')
 
-    license = host.file(license_dir + '/license.txt')
-    assert license.exists
-    assert license.is_file
+    if version == '12-SP4':
+        # Skip SLES12-SP4 which has a combined license
+        pytest.skip('SLES12-SP4 has combined license.')
 
-    try:
-        assert license.contains(license_content)
-    except AssertionError:
-        # SLE15 license text changed
-        license_content = 'SUSE(R) Linux Enterprise End User License Agreement'
-        assert license.contains(license_content)
+    license_dirs = [
+        '/etc/YaST2/licenses/ha/',
+        '/etc/YaST2/licenses/SLES_SAP/'
+    ]
+    result = confirm_sles_license_content(license_dirs)
+
+    if result is False:
+        pytest.fail(
+            'SUSE End User License Agreement not found '
+            'or license has incorrect content.'
+        )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python3-ipa-2.2.0/usr/share/lib/ipa/tests/SLES/conftest.py 
new/python3-ipa-2.3.0/usr/share/lib/ipa/tests/SLES/conftest.py
--- old/python3-ipa-2.2.0/usr/share/lib/ipa/tests/SLES/conftest.py      
2018-10-31 20:06:48.000000000 +0100
+++ new/python3-ipa-2.3.0/usr/share/lib/ipa/tests/SLES/conftest.py      
2018-11-09 17:57:12.000000000 +0100
@@ -265,15 +265,30 @@
 @pytest.fixture()
 def is_sles_sap(host):
     def f():
-        license_dir = '/etc/YaST2/licenses/ha'
-        lic_dir = host.file(license_dir)
-        try:
-            assert lic_dir.exists
-            assert lic_dir.is_directory
-        except AssertionError:
-            # SLE15 dir changed
-            license_dir = '/etc/YaST2/licenses/SLES_SAP'
+        sap = host.file('/etc/products.d/SLES_SAP.prod')
+        return sap.exists and sap.is_file
+    return f
+
+
[email protected]()
+def confirm_sles_license_content(host):
+    def f(license_dirs):
+        license_content = [
+            'SUSE End User License Agreement',
+            'SUSE(R) Linux Enterprise End User License Agreement',
+            'SUSEĀ® Linux Enterprise End User License Agreement'
+        ]
+
+        for license_dir in license_dirs:
             lic_dir = host.file(license_dir)
-            return lic_dir.exists and lic_dir.is_directory
-        return True
+
+            if lic_dir.exists and lic_dir.is_directory:
+                lic = host.file(license_dir + 'license.txt')
+                return all([
+                    lic.exists,
+                    lic.is_file,
+                    any(lic.contains(content) for content in license_content)
+                ])
+
+        return False
     return f
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python3-ipa-2.2.0/usr/share/lib/ipa/tests/SLES/test_sles_license.py 
new/python3-ipa-2.3.0/usr/share/lib/ipa/tests/SLES/test_sles_license.py
--- old/python3-ipa-2.2.0/usr/share/lib/ipa/tests/SLES/test_sles_license.py     
2018-10-31 16:10:33.000000000 +0100
+++ new/python3-ipa-2.3.0/usr/share/lib/ipa/tests/SLES/test_sles_license.py     
2018-11-09 17:57:12.000000000 +0100
@@ -1,22 +1,15 @@
-def test_sles_license(host):
-    license_dir = '/etc/YaST2/licenses/base'
-    license_content = 'SUSE End User License Agreement'
+import pytest
 
-    lic_dir = host.file(license_dir)
-    if not lic_dir.exists:
-        license_dir = '/etc/YaST2/licenses/SLES'
-        lic_dir = host.file(license_dir)
 
-    assert lic_dir.exists
-    assert lic_dir.is_directory
+def test_sles_license(host, confirm_sles_license_content):
+    license_dirs = [
+        '/etc/YaST2/licenses/base/',
+        '/etc/YaST2/licenses/SLES/'
+    ]
+    result = confirm_sles_license_content(license_dirs)
 
-    license = host.file(license_dir + '/license.txt')
-    assert license.exists
-    assert license.is_file
-
-    try:
-        assert license.contains(license_content)
-    except Exception:
-        # SLE15 license text changed
-        license_content = 'SUSE(R) Linux Enterprise End User License Agreement'
-        assert license.contains(license_content)
+    if result is False:
+        pytest.fail(
+            'SUSE End User License Agreement not found '
+            'or license has incorrect content.'
+        )


Reply via email to