Best Python code snippet using molecule_python
ansible.py
Source:ansible.py
...304 roles_path = default_env['ANSIBLE_ROLES_PATH']305 library_path = default_env['ANSIBLE_LIBRARY']306 filter_plugins_path = default_env['ANSIBLE_FILTER_PLUGINS']307 try:308 path = self._absolute_path_for(env, 'ANSIBLE_ROLES_PATH')309 roles_path = '{}:{}'.format(roles_path, path)310 except KeyError:311 pass312 try:313 path = self._absolute_path_for(env, 'ANSIBLE_LIBRARY')314 library_path = '{}:{}'.format(library_path, path)315 except KeyError:316 pass317 try:318 path = self._absolute_path_for(env, 'ANSIBLE_FILTER_PLUGINS')319 filter_plugins_path = '{}:{}'.format(filter_plugins_path, path)320 except KeyError:321 pass322 env['ANSIBLE_ROLES_PATH'] = roles_path323 env['ANSIBLE_LIBRARY'] = library_path324 env['ANSIBLE_FILTER_PLUGINS'] = filter_plugins_path325 return util.merge_dicts(default_env, env)326 @property327 def host_vars(self):328 return self._config.config['provisioner']['inventory']['host_vars']329 @property330 def group_vars(self):331 return self._config.config['provisioner']['inventory']['group_vars']332 @property333 def links(self):334 return self._config.config['provisioner']['inventory']['links']335 @property336 def inventory(self):337 """338 Create an inventory structure and returns a dict.339 .. code-block:: yaml340 ungrouped:341 vars:342 foo: bar343 hosts:344 instance-1:345 instance-2:346 children:347 $child_group_name:348 hosts:349 instance-1:350 instance-2:351 $group_name:352 hosts:353 instance-1:354 ansible_connection: docker355 instance-2:356 ansible_connection: docker357 :return: str358 """359 dd = self._vivify()360 for platform in self._config.platforms.instances:361 for group in platform.get('groups', ['ungrouped']):362 instance_name = platform['name']363 connection_options = self.connection_options(instance_name)364 molecule_vars = {365 'molecule_file':366 "{{ lookup('env', 'MOLECULE_FILE') }}",367 'molecule_ephemeral_directory':368 "{{ lookup('env', 'MOLECULE_EPHEMERAL_DIRECTORY') }}",369 'molecule_scenario_directory':370 "{{ lookup('env', 'MOLECULE_SCENARIO_DIRECTORY') }}",371 'molecule_yml':372 "{{ lookup('file', molecule_file) | molecule_from_yaml }}",373 'molecule_instance_config':374 "{{ lookup('env', 'MOLECULE_INSTANCE_CONFIG') }}",375 }376 # All group377 dd['all']['hosts'][instance_name] = connection_options378 dd['all']['vars'] = molecule_vars379 # Named group380 dd[group]['hosts'][instance_name] = connection_options381 dd[group]['vars'] = molecule_vars382 # Ungrouped383 dd['ungrouped']['vars'] = {}384 # Children385 for child_group in platform.get('children', []):386 dd[group]['children'][child_group]['hosts'][387 instance_name] = connection_options388 return self._default_to_regular(dd)389 @property390 def inventory_file(self):391 return os.path.join(self._config.scenario.ephemeral_directory,392 'ansible_inventory.yml')393 @property394 def config_file(self):395 return os.path.join(self._config.scenario.ephemeral_directory,396 'ansible.cfg')397 @property398 @util.memoize399 def playbooks(self):400 return ansible_playbooks.AnsiblePlaybooks(self._config)401 @property402 def directory(self):403 return os.path.join(404 os.path.dirname(__file__), os.path.pardir, os.path.pardir,405 'molecule', 'provisioner', 'ansible')406 def connection_options(self, instance_name):407 d = self._config.driver.ansible_connection_options(instance_name)408 return util.merge_dicts(409 d, self._config.config['provisioner']['connection_options'])410 def check(self):411 """412 Executes `ansible-playbook` against the converge playbook with the413 ``--check`` flag and returns None.414 :return: None415 """416 pb = self._get_ansible_playbook(self.playbooks.converge)417 pb.add_cli_arg('check', True)418 pb.execute()419 def converge(self, playbook=None, **kwargs):420 """421 Executes `ansible-playbook` against the converge playbook unless422 specified otherwise and returns a string.423 :param playbook: An optional string containing an absolute path to a424 playbook.425 :param kwargs: An optional keyword arguments.426 :return: str427 """428 if playbook is None:429 pb = self._get_ansible_playbook(self.playbooks.converge, **kwargs)430 else:431 pb = self._get_ansible_playbook(playbook, **kwargs)432 return pb.execute()433 def destroy(self):434 """435 Executes `ansible-playbook` against the destroy playbook and returns436 None.437 :return: None438 """439 pb = self._get_ansible_playbook(self.playbooks.destroy)440 pb.execute()441 def side_effect(self):442 """443 Executes `ansible-playbook` against the side_effect playbook and444 returns None.445 :return: None446 """447 pb = self._get_ansible_playbook(self.playbooks.side_effect)448 pb.execute()449 def create(self):450 """451 Executes `ansible-playbook` against the create playbook and returns452 None.453 :return: None454 """455 pb = self._get_ansible_playbook(self.playbooks.create)456 pb.execute()457 def prepare(self):458 """459 Executes `ansible-playbook` against the prepare playbook and returns460 None.461 :return: None462 """463 pb = self._get_ansible_playbook(self.playbooks.prepare)464 pb.execute()465 def syntax(self):466 """467 Executes `ansible-playbook` against the converge playbook with the468 ``-syntax-check`` flag and returns None.469 :return: None470 """471 pb = self._get_ansible_playbook(self.playbooks.converge)472 pb.add_cli_arg('syntax-check', True)473 pb.execute()474 def verify(self):475 """476 Executes `ansible-playbook` against the verify playbook and returns477 None.478 :return: None479 """480 pb = self._get_ansible_playbook(self.playbooks.verify)481 pb.execute()482 def write_config(self):483 """484 Writes the provisioner's config file to disk and returns None.485 :return: None486 """487 template = util.render_template(488 self._get_config_template(), config_options=self.config_options)489 util.write_file(self.config_file, template)490 def manage_inventory(self):491 """492 Manages inventory for Ansible and returns None.493 :returns: None494 """495 self._write_inventory()496 self._remove_vars()497 if not self.links:498 self._add_or_update_vars()499 else:500 self._link_or_update_vars()501 def abs_path(self, path):502 return util.abs_path(503 os.path.join(self._config.scenario.directory, path))504 def _add_or_update_vars(self):505 """506 Creates host and/or group vars and returns None.507 :returns: None508 """509 for target in ['host_vars', 'group_vars']:510 if target == 'host_vars':511 vars_target = copy.deepcopy(self.host_vars)512 for instance_name, _ in self.host_vars.items():513 if instance_name == 'localhost':514 instance_key = instance_name515 else:516 instance_key = instance_name517 vars_target[instance_key] = vars_target.pop(instance_name)518 elif target == 'group_vars':519 vars_target = self.group_vars520 if vars_target:521 ephemeral_directory = self._config.scenario.ephemeral_directory522 target_vars_directory = os.path.join(ephemeral_directory,523 target)524 if not os.path.isdir(util.abs_path(target_vars_directory)):525 os.mkdir(util.abs_path(target_vars_directory))526 for target in vars_target.keys():527 target_var_content = vars_target[target]528 path = os.path.join(529 util.abs_path(target_vars_directory), target)530 util.write_file(path, util.safe_dump(target_var_content))531 def _write_inventory(self):532 """533 Writes the provisioner's inventory file to disk and returns None.534 :return: None535 """536 self._verify_inventory()537 util.write_file(self.inventory_file, util.safe_dump(self.inventory))538 def _remove_vars(self):539 """540 Remove host and/or group vars and returns None.541 :returns: None542 """543 dirs = [544 os.path.join(self._config.scenario.ephemeral_directory,545 'group_vars'),546 os.path.join(self._config.scenario.ephemeral_directory,547 'host_vars'),548 ]549 for d in dirs:550 if os.path.islink(d):551 os.unlink(d)552 else:553 if os.path.exists(d):554 shutil.rmtree(d)555 def _link_or_update_vars(self):556 """557 Creates or updates the symlink to group_vars and returns None.558 :returns: None559 """560 for d, source in self.links.items():561 target = os.path.join(self._config.scenario.ephemeral_directory, d)562 source = os.path.join(self._config.scenario.directory, source)563 if not os.path.exists(source):564 msg = "The source path '{}' does not exist.".format(source)565 util.sysexit_with_message(msg)566 msg = "Inventory {} linked to {}".format(source, target)567 LOG.info(msg)568 os.symlink(source, target)569 def _get_ansible_playbook(self, playbook, **kwargs):570 """571 Get an instance of AnsiblePlaybook and returns it.572 :param playbook: A string containing an absolute path to a573 provisioner's playbook.574 :param kwargs: An optional keyword arguments.575 :return: object576 """577 return ansible_playbook.AnsiblePlaybook(playbook, self._config,578 **kwargs)579 def _verify_inventory(self):580 """581 Verify the inventory is valid and returns None.582 :return: None583 """584 if not self.inventory:585 msg = ("Instances missing from the 'platform' "586 "section of molecule.yml.")587 util.sysexit_with_message(msg)588 def _get_config_template(self):589 """590 Returns a config template string.591 :return: str592 """593 return """594{% for section, section_dict in config_options.items() -%}595[{{ section }}]596{% for k, v in section_dict.items() -%}597{{ k }} = {{ v }}598{% endfor -%}599{% endfor -%}600""".strip()601 def _vivify(self):602 """603 Returns an autovivification default dict.604 :return: dict605 """606 return collections.defaultdict(self._vivify)607 def _default_to_regular(self, d):608 if isinstance(d, collections.defaultdict):609 d = {k: self._default_to_regular(v) for k, v in d.items()}610 return d611 def _get_plugin_directory(self):612 return os.path.join(self.directory, 'plugins')613 def _get_libraries_directory(self):614 return util.abs_path(615 os.path.join(self._get_plugin_directory(), 'libraries'))616 def _get_filter_plugin_directory(self):617 return util.abs_path(618 os.path.join(self._get_plugin_directory(), 'filters'))619 def _absolute_path_for(self, env, key):...
ansible_collection.py
Source:ansible_collection.py
...131 roles_path = default_env['ANSIBLE_ROLES_PATH']132 library_path = default_env['ANSIBLE_LIBRARY']133 filter_plugins_path = default_env['ANSIBLE_FILTER_PLUGINS']134 try:135 path = self._absolute_path_for(env, 'ANSIBLE_ROLES_PATH')136 roles_path = '{}:{}'.format(roles_path, path)137 except KeyError:138 pass139 try:140 path = self._absolute_path_for(env, 'ANSIBLE_LIBRARY')141 library_path = '{}:{}'.format(library_path, path)142 except KeyError:143 pass144 try:145 path = self._absolute_path_for(env, 'ANSIBLE_FILTER_PLUGINS')146 filter_plugins_path = '{}:{}'.format(filter_plugins_path, path)147 except KeyError:148 pass149 env['ANSIBLE_ROLES_PATH'] = roles_path150 env['ANSIBLE_LIBRARY'] = library_path151 env['ANSIBLE_FILTER_PLUGINS'] = filter_plugins_path152 return util.merge_dicts(default_env, env)153 @property154 def hosts(self):155 return self._config.config['provisioner']['inventory']['hosts']156 @property157 def host_vars(self):158 return self._config.config['provisioner']['inventory']['host_vars']159 @property160 def group_vars(self):161 return self._config.config['provisioner']['inventory']['group_vars']162 @property163 def links(self):164 return self._config.config['provisioner']['inventory']['links']165 @property166 def inventory(self):167 """168 Create an inventory structure and returns a dict.169 .. code-block:: yaml170 ungrouped:171 vars:172 foo: bar173 hosts:174 instance-1:175 instance-2:176 children:177 $child_group_name:178 hosts:179 instance-1:180 instance-2:181 $group_name:182 hosts:183 instance-1:184 ansible_connection: docker185 instance-2:186 ansible_connection: docker187 :return: str188 """189 dd = self._vivify()190 for platform in self._config.platforms.instances:191 for group in platform.get('groups', ['ungrouped']):192 instance_name = platform['name']193 connection_options = self.connection_options(instance_name)194 molecule_vars = {195 'molecule_file':196 "{{ lookup('env', 'MOLECULE_FILE') }}",197 'molecule_ephemeral_directory':198 "{{ lookup('env', 'MOLECULE_EPHEMERAL_DIRECTORY') }}",199 'molecule_scenario_directory':200 "{{ lookup('env', 'MOLECULE_SCENARIO_DIRECTORY') }}",201 'molecule_yml':202 "{{ lookup('file', molecule_file) | molecule_from_yaml }}",203 'molecule_instance_config':204 "{{ lookup('env', 'MOLECULE_INSTANCE_CONFIG') }}",205 'molecule_no_log':206 "{{ lookup('env', 'MOLECULE_NO_LOG') or not "207 "molecule_yml.provisioner.log|default(False) | bool }}"208 }209 # All group210 dd['all']['hosts'][instance_name] = connection_options211 dd['all']['vars'] = molecule_vars212 # Named group213 dd[group]['hosts'][instance_name] = connection_options214 dd[group]['vars'] = molecule_vars215 # Ungrouped216 dd['ungrouped']['vars'] = {}217 # Children218 for child_group in platform.get('children', []):219 dd[group]['children'][child_group]['hosts'][220 instance_name] = connection_options221 return self._default_to_regular(dd)222 @property223 def inventory_directory(self):224 return self._config.scenario.inventory_directory225 @property226 def inventory_file(self):227 return os.path.join(self.inventory_directory, 'ansible_inventory.yml')228 @property229 def config_file(self):230 return os.path.join(self._config.scenario.ephemeral_directory,231 'ansible.cfg')232 @property233 @util.memoize234 def playbooks(self):235 return ansible_playbooks.AnsiblePlaybooks(self._config)236 @property237 def directory(self):238 return os.path.join(239 os.path.dirname(__file__), os.path.pardir, os.path.pardir,240 'molecule', 'provisioner', 'ansible')241 def cleanup(self):242 """243 Executes `ansible-playbook` against the cleanup playbook and returns244 None.245 :return: None246 """247 pb = self._get_ansible_playbook(self.playbooks.cleanup)248 pb.execute()249 def connection_options(self, instance_name):250 d = self._config.driver.ansible_connection_options(instance_name)251 return util.merge_dicts(252 d, self._config.config['provisioner']['connection_options'])253 def check(self):254 """255 Executes ``ansible-playbook`` against the converge playbook with the256 ``--check`` flag and returns None.257 :return: None258 """259 pb = self._get_ansible_playbook(self.playbooks.converge)260 pb.add_cli_arg('check', True)261 pb.execute()262 def converge(self, playbook=None, **kwargs):263 """264 Executes ``ansible-playbook`` against the converge playbook unless265 specified otherwise and returns a string.266 :param playbook: An optional string containing an absolute path to a267 playbook.268 :param kwargs: An optional keyword arguments.269 :return: str270 """271 if playbook is None:272 pb = self._get_ansible_playbook(self.playbooks.converge, **kwargs)273 else:274 pb = self._get_ansible_playbook(playbook, **kwargs)275 return pb.execute()276 def destroy(self):277 """278 Executes ``ansible-playbook`` against the destroy playbook and returns279 None.280 :return: None281 """282 pb = self._get_ansible_playbook(self.playbooks.destroy)283 pb.execute()284 def side_effect(self):285 """286 Executes ``ansible-playbook`` against the side_effect playbook and287 returns None.288 :return: None289 """290 pb = self._get_ansible_playbook(self.playbooks.side_effect)291 pb.execute()292 def create(self):293 """294 Executes ``ansible-playbook`` against the create playbook and returns295 None.296 :return: None297 """298 pb = self._get_ansible_playbook(self.playbooks.create)299 pb.execute()300 def prepare(self):301 """302 Executes ``ansible-playbook`` against the prepare playbook and returns303 None.304 :return: None305 """306 pb = self._get_ansible_playbook(self.playbooks.prepare)307 pb.execute()308 def syntax(self):309 """310 Executes ``ansible-playbook`` against the converge playbook with the311 ``-syntax-check`` flag and returns None.312 :return: None313 """314 pb = self._get_ansible_playbook(self.playbooks.converge)315 pb.add_cli_arg('syntax-check', True)316 pb.execute()317 def verify(self):318 """319 Executes ``ansible-playbook`` against the verify playbook and returns320 None.321 :return: None322 """323 pb = self._get_ansible_playbook(self.playbooks.verify)324 pb.execute()325 def write_config(self):326 """327 Writes the provisioner's config file to disk and returns None.328 :return: None329 """330 template = util.render_template(331 self._get_config_template(), config_options=self.config_options)332 util.write_file(self.config_file, template)333 def manage_inventory(self):334 """335 Manages inventory for Ansible and returns None.336 :returns: None337 """338 self._write_inventory()339 self._remove_vars()340 if not self.links:341 self._add_or_update_vars()342 else:343 self._link_or_update_vars()344 def abs_path(self, path):345 return util.abs_path(346 os.path.join(self._config.scenario.directory, path))347 def _add_or_update_vars(self):348 """349 Creates host and/or group vars and returns None.350 :returns: None351 """352 # Create the hosts extra inventory source (only if not empty)353 hosts_file = os.path.join(self.inventory_directory, 'hosts')354 if self.hosts:355 util.write_file(hosts_file, util.safe_dump(self.hosts))356 # Create the host_vars and group_vars directories357 for target in ['host_vars', 'group_vars']:358 if target == 'host_vars':359 vars_target = copy.deepcopy(self.host_vars)360 for instance_name, _ in self.host_vars.items():361 if instance_name == 'localhost':362 instance_key = instance_name363 else:364 instance_key = instance_name365 vars_target[instance_key] = vars_target.pop(instance_name)366 elif target == 'group_vars':367 vars_target = self.group_vars368 if vars_target:369 target_vars_directory = os.path.join(self.inventory_directory,370 target)371 if not os.path.isdir(util.abs_path(target_vars_directory)):372 os.mkdir(util.abs_path(target_vars_directory))373 for target in vars_target.keys():374 target_var_content = vars_target[target]375 path = os.path.join(376 util.abs_path(target_vars_directory), target)377 util.write_file(path, util.safe_dump(target_var_content))378 def _write_inventory(self):379 """380 Writes the provisioner's inventory file to disk and returns None.381 :return: None382 """383 self._verify_inventory()384 util.write_file(self.inventory_file, util.safe_dump(self.inventory))385 def _remove_vars(self):386 """387 Remove hosts/host_vars/group_vars and returns None.388 :returns: None389 """390 for name in ("hosts", "group_vars", "host_vars"):391 d = os.path.join(self.inventory_directory, name)392 if os.path.islink(d) or os.path.isfile(d):393 os.unlink(d)394 elif os.path.isdir(d):395 shutil.rmtree(d)396 def _link_or_update_vars(self):397 """398 Creates or updates the symlink to group_vars and returns None.399 :returns: None400 """401 for d, source in self.links.items():402 target = os.path.join(self.inventory_directory, d)403 source = os.path.join(self._config.scenario.directory, source)404 if not os.path.exists(source):405 msg = "The source path '{}' does not exist.".format(source)406 util.sysexit_with_message(msg)407 msg = "Inventory {} linked to {}".format(source, target)408 LOG.info(msg)409 os.symlink(source, target)410 def _get_ansible_playbook(self, playbook, **kwargs):411 """412 Get an instance of AnsiblePlaybook and returns it.413 :param playbook: A string containing an absolute path to a414 provisioner's playbook.415 :param kwargs: An optional keyword arguments.416 :return: object417 """418 return ansible_playbook.AnsiblePlaybook(playbook, self._config,419 **kwargs)420 def _verify_inventory(self):421 """422 Verify the inventory is valid and returns None.423 :return: None424 """425 if not self.inventory:426 msg = ("Instances missing from the 'platform' "427 "section of molecule.yml.")428 util.sysexit_with_message(msg)429 def _get_config_template(self):430 """431 Returns a config template string.432 :return: str433 """434 return """435{% for section, section_dict in config_options.items() -%}436[{{ section }}]437{% for k, v in section_dict.items() -%}438{{ k }} = {{ v }}439{% endfor -%}440{% endfor -%}441""".strip()442 def _vivify(self):443 """444 Returns an autovivification default dict.445 :return: dict446 """447 return collections.defaultdict(self._vivify)448 def _default_to_regular(self, d):449 if isinstance(d, collections.defaultdict):450 d = {k: self._default_to_regular(v) for k, v in d.items()}451 return d452 def _get_plugin_directory(self):453 return os.path.join(self.directory, 'plugins')454 def _get_libraries_directory(self):455 return util.abs_path(456 os.path.join(self._get_plugin_directory(), 'libraries'))457 def _get_filter_plugin_directory(self):458 return util.abs_path(459 os.path.join(self._get_plugin_directory(), 'filters'))460 def _absolute_path_for(self, env, key):...
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!