summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason DeTiberus <jdetiber@redhat.com>2015-04-25 00:12:25 -0400
committerJason DeTiberus <jdetiber@redhat.com>2015-07-28 06:26:04 -0400
commit520a125693cc51e174b16517510c5bb4faa7b51c (patch)
tree069494ca39660c6283043e869ad1628e7a5701b9
parenta46b3a4dc4d940f291ee94e5e488e491799d7bde (diff)
downloadansible-modules-core-520a125693cc51e174b16517510c5bb4faa7b51c.tar.gz
bugfixes for redhat_subscription
- correctly return pool ids for newer versions of subscription-manager - allow for managing subscriptions after initial registration.
-rw-r--r--packaging/os/redhat_subscription.py77
1 files changed, 62 insertions, 15 deletions
diff --git a/packaging/os/redhat_subscription.py b/packaging/os/redhat_subscription.py
index 1cfd8fc2..0c4647cc 100644
--- a/packaging/os/redhat_subscription.py
+++ b/packaging/os/redhat_subscription.py
@@ -180,7 +180,7 @@ class Rhsm(RegistrationBase):
for k,v in kwargs.items():
if re.search(r'^(system|rhsm)_', k):
args.append('--%s=%s' % (k.replace('_','.'), v))
-
+
self.module.run_command(args, check_rc=True)
@property
@@ -226,14 +226,26 @@ class Rhsm(RegistrationBase):
rc, stderr, stdout = self.module.run_command(args, check_rc=True)
- def unsubscribe(self):
+ def unsubscribe(self, serials=None):
'''
- Unsubscribe a system from all subscribed channels
+ Unsubscribe a system from subscribed channels
+ Args:
+ serials(list or None): list of serials to unsubscribe. If
+ serials is none or an empty list, then
+ all subscribed channels will be removed.
Raises:
* Exception - if error occurs while running command
'''
- args = ['subscription-manager', 'unsubscribe', '--all']
- rc, stderr, stdout = self.module.run_command(args, check_rc=True)
+ items = []
+ if serials is not None and serials:
+ items = ["--serial=%s" % s for s in serials]
+ if serials is None:
+ items = ["--all"]
+
+ if items:
+ args = ['subscription-manager', 'unsubscribe'] + items
+ rc, stderr, stdout = self.module.run_command(args, check_rc=True)
+ return serials
def unregister(self):
'''
@@ -255,8 +267,27 @@ class Rhsm(RegistrationBase):
# Available pools ready for subscription
available_pools = RhsmPools(self.module)
+ subscribed_pool_ids = []
for pool in available_pools.filter(regexp):
pool.subscribe()
+ subscribed_pool_ids.append(pool.get_pool_id())
+ return subscribed_pool_ids
+
+ def update_subscriptions(self, regexp):
+ changed=False
+ consumed_pools = RhsmPools(self.module, consumed=True)
+ pool_ids_to_keep = [p.get_pool_id() for p in consumed_pools.filter(regexp)]
+
+ serials_to_remove=[p.Serial for p in consumed_pools if p.get_pool_id() not in pool_ids_to_keep]
+ serials = self.unsubscribe(serials=serials_to_remove)
+
+ subscribed_pool_ids = self.subscribe(regexp)
+
+ if subscribed_pool_ids or serials:
+ changed=True
+ return {'changed': changed, 'subscribed_pool_ids': subscribed_pool_ids,
+ 'unsubscribed_serials': serials}
+
class RhsmPool(object):
@@ -272,8 +303,11 @@ class RhsmPool(object):
def __str__(self):
return str(self.__getattribute__('_name'))
+ def get_pool_id(self):
+ return getattr(self, 'PoolId', getattr(self, 'PoolID'))
+
def subscribe(self):
- args = "subscription-manager subscribe --pool %s" % self.PoolId
+ args = "subscription-manager subscribe --pool %s" % self.get_pool_id()
rc, stdout, stderr = self.module.run_command(args, check_rc=True)
if rc == 0:
return True
@@ -285,18 +319,22 @@ class RhsmPools(object):
"""
This class is used for manipulating pools subscriptions with RHSM
"""
- def __init__(self, module):
+ def __init__(self, module, consumed=False):
self.module = module
- self.products = self._load_product_list()
+ self.products = self._load_product_list(consumed)
def __iter__(self):
return self.products.__iter__()
- def _load_product_list(self):
+ def _load_product_list(self, consumed=False):
"""
- Loads list of all available pools for system in data structure
+ Loads list of all available or consumed pools for system in data structure
+
+ Args:
+ consumed(bool): if True list consumed pools, else list available pools (default False)
"""
- args = "subscription-manager list --available"
+ args = "subscription-manager list"
+ args += " --consumed" if consumed else " --available"
rc, stdout, stderr = self.module.run_command(args, check_rc=True)
products = []
@@ -375,18 +413,27 @@ def main():
# Register system
if rhn.is_registered:
- module.exit_json(changed=False, msg="System already registered.")
+ if pool != '^$':
+ try:
+ result = rhn.update_subscriptions(pool)
+ except Exception, e:
+ module.fail_json(msg="Failed to update subscriptions for '%s': %s" % (server_hostname, e))
+ else:
+ module.exit_json(**result)
+ else:
+ module.exit_json(changed=False, msg="System already registered.")
else:
try:
rhn.enable()
rhn.configure(**module.params)
rhn.register(username, password, autosubscribe, activationkey, org_id)
- rhn.subscribe(pool)
+ subscribed_pool_ids = rhn.subscribe(pool)
except Exception, e:
module.fail_json(msg="Failed to register with '%s': %s" % (server_hostname, e))
else:
- module.exit_json(changed=True, msg="System successfully registered to '%s'." % server_hostname)
-
+ module.exit_json(changed=True,
+ msg="System successfully registered to '%s'." % server_hostname,
+ subscribed_pool_ids=subscribed_pool_ids)
# Ensure system is *not* registered
if state == 'absent':
if not rhn.is_registered: