def main(): module = KatelloAnsibleModule(argument_spec=dict( src=dict(required=True, type='path', aliases=['file']), repository=dict(required=True), product=dict(required=True), organization=dict(required=True), ), ) entity_dict = module.clean_params() module.connect() entity_dict['organization'] = module.find_resource_by_name( 'organizations', entity_dict['organization'], thin=True) scope = {'organization_id': entity_dict['organization']['id']} entity_dict['product'] = module.find_resource_by_name( 'products', entity_dict['product'], params=scope, thin=True) product_scope = {'product_id': entity_dict['product']['id']} entity_dict['repository'] = module.find_resource_by_name( 'repositories', entity_dict['repository'], params=product_scope) repository_scope = {'repository_id': entity_dict['repository']['id']} filename = os.path.basename(entity_dict['src']) checksum = hashlib.sha256() with open(entity_dict['src'], 'rb') as contentfile: for chunk in iter(lambda: contentfile.read(CONTENT_CHUNK_SIZE), b""): checksum.update(chunk) checksum = checksum.hexdigest() content_unit = None if entity_dict['repository']['content_type'] == 'deb': if not HAS_DEBFILE: module.fail_json(msg='The python-debian module is required', exception=DEBFILE_IMP_ERR) name, version, architecture = get_deb_info(entity_dict['src']) query = 'name = "{0}" and version = "{1}" and architecture = "{2}"'.format( name, version, architecture) content_unit = module.find_resource('debs', query, params=repository_scope, failsafe=True) elif entity_dict['repository']['content_type'] == 'yum': if not HAS_RPM: module.fail_json(msg='The rpm Python module is required', exception=RPM_IMP_ERR) name, epoch, version, release, arch = get_rpm_info(entity_dict['src']) query = 'name = "{0}" and epoch = "{1}" and version = "{2}" and release = "{3}" and arch = "{4}"'.format( name, epoch, version, release, arch) content_unit = module.find_resource('packages', query, params=repository_scope, failsafe=True) elif entity_dict['repository']['content_type'] == 'file': query = 'name = "{0}" and checksum = "{1}"'.format(filename, checksum) content_unit = module.find_resource('file_units', query, params=repository_scope, failsafe=True) else: # possible types in 3.12: docker, ostree, yum, puppet, file, deb module.fail_json( msg="Uploading to a {0} repository is not supported yet.".format( entity_dict['repository']['content_type'])) if not content_unit: if not module.check_mode: content_upload = module.resource_action('content_uploads', 'create', repository_scope) content_upload_scope = {'id': content_upload['upload_id']} content_upload_scope.update(repository_scope) offset = 0 with open(entity_dict['src'], 'rb') as contentfile: for chunk in iter(lambda: contentfile.read(CONTENT_CHUNK_SIZE), b""): data = {'content': chunk, 'offset': offset} module.resource_action('content_uploads', 'update', params=content_upload_scope, data=data) offset += len(chunk) uploads = [{ 'id': content_upload['upload_id'], 'name': filename, 'size': offset, 'checksum': checksum }] import_params = { 'id': entity_dict['repository']['id'], 'uploads': uploads } module.resource_action('repositories', 'import_uploads', import_params) module.resource_action('content_uploads', 'destroy', content_upload_scope) else: module.set_changed() module.exit_json()
def main(): module = KatelloAnsibleModule(argument_spec=dict( src=dict(required=True, type='path', aliases=['file']), repository=dict(required=True), product=dict(required=True), organization=dict(required=True), ), ) entity_dict = module.clean_params() module.connect() entity_dict['organization'] = module.find_resource_by_name( 'organizations', entity_dict['organization'], thin=True) scope = {'organization_id': entity_dict['organization']['id']} entity_dict['product'] = module.find_resource_by_name( 'products', entity_dict['product'], params=scope, thin=True) product_scope = {'product_id': entity_dict['product']['id']} entity_dict['repository'] = module.find_resource_by_name( 'repositories', entity_dict['repository'], params=product_scope) repository_scope = {'repository_id': entity_dict['repository']['id']} filename = os.path.basename(entity_dict['src']) checksum = hashlib.sha256() with open(entity_dict['src'], 'rb') as contentfile: for chunk in iter(lambda: contentfile.read(CONTENT_CHUNK_SIZE), b""): checksum.update(chunk) checksum = checksum.hexdigest() content_unit = None if entity_dict['repository']['content_type'] == 'yum': name, epoch, version, release, arch = check_output([ 'rpm', '--queryformat', '%{NAME} %{EPOCHNUM} %{VERSION} %{RELEASE} %{ARCH}', '-qp', entity_dict['src'] ]).decode('ascii').split() query = 'name = "{0}" and epoch = "{1}" and version = "{2}" and release = "{3}" and arch = "{4}"'.format( name, epoch, version, release, arch) content_unit = module.find_resource('packages', query, params=repository_scope, failsafe=True) elif entity_dict['repository']['content_type'] == 'file': query = 'name = "{0}" and checksum = "{1}"'.format(filename, checksum) content_unit = module.find_resource('file_units', query, params=repository_scope, failsafe=True) else: # possible types in 3.12: docker, ostree, yum, puppet, file, deb module.fail_json( msg="Uploading to a {0} repository is not supported yet.".format( entity_dict['repository']['content_type'])) changed = False if not content_unit: _content_upload_changed, content_upload = module.resource_action( 'content_uploads', 'create', repository_scope) content_upload_scope = {'id': content_upload['upload_id']} content_upload_scope.update(repository_scope) offset = 0 with open(entity_dict['src'], 'rb') as contentfile: for chunk in iter(lambda: contentfile.read(CONTENT_CHUNK_SIZE), b""): data = {'content': chunk, 'offset': offset} module.resource_action('content_uploads', 'update', params=content_upload_scope, data=data) offset += len(chunk) uploads = [{ 'id': content_upload['upload_id'], 'name': filename, 'size': offset, 'checksum': checksum }] import_params = { 'id': entity_dict['repository']['id'], 'uploads': uploads } module.resource_action('repositories', 'import_uploads', import_params) module.resource_action('content_uploads', 'destroy', content_upload_scope) changed = True module.exit_json(changed=changed)