def install(package, exact_version=None, compatible_version=None, custom_version=None): if not extension_exists(EXTENSION_NAME): raise RuntimeError('iot extension is misconfigured') ext_path = get_extension_path(EXTENSION_NAME) cmd = [sys.executable, '-m', 'pip', '--disable-pip-version-check', '--no-cache-dir', 'install', '-U', '--target', ext_path] cmd_suffix = None if exact_version: cmd_suffix = '{}=={}'.format(package, exact_version) elif compatible_version: cmd_suffix = '{}~={}'.format(package, compatible_version) elif custom_version: cmd_suffix = '{}{}'.format(package, custom_version) else: cmd_suffix = package cmd.append(cmd_suffix) logger.info(cmd) try: log_output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, universal_newlines=True) logger.debug(log_output) return True except subprocess.CalledProcessError as e: logger.debug(e.output) logger.debug(e) return False
def add_extension( source=None, extension_name=None, index_url=None, yes=None, # pylint: disable=unused-argument pip_extra_index_urls=None, pip_proxy=None): ext_sha256 = None if extension_name: if extension_exists(extension_name): logger.warning("The extension '%s' already exists.", extension_name) return try: source, ext_sha256 = resolve_from_index(extension_name, index_url=index_url) except NoExtensionCandidatesError as err: logger.debug(err) raise CLIError( "No matching extensions for '{}'. Use --debug for more information." .format(extension_name)) _add_whl_ext(source, ext_sha256=ext_sha256, pip_extra_index_urls=pip_extra_index_urls, pip_proxy=pip_proxy) _augment_telemetry_with_ext_info(extension_name) try: if extension_name and get_extension(extension_name).preview: logger.warning("The installed extension '%s' is in preview.", extension_name) except ExtensionNotInstalledException: pass
def _add_whl_ext(source): # pylint: disable=too-many-statements url_parse_result = urlparse(source) is_url = (url_parse_result.scheme == 'http' or url_parse_result.scheme == 'https') logger.debug('Extension source is url? %s', is_url) whl_filename = os.path.basename(url_parse_result.path) if is_url else os.path.basename(source) parsed_filename = WHEEL_INFO_RE(whl_filename) extension_name = parsed_filename.groupdict().get('name') if parsed_filename else None if not extension_name: raise CLIError('Unable to determine extension name from {}. Is the file name correct?'.format(source)) if extension_exists(extension_name): raise CLIError('The extension {} already exists.'.format(extension_name)) ext_file = None if is_url: # Download from URL tmp_dir = tempfile.mkdtemp() ext_file = os.path.join(tmp_dir, whl_filename) logger.debug('Downloading %s to %s', source, ext_file) try: _whl_download_from_url(url_parse_result, ext_file) except (requests.exceptions.ConnectionError, requests.exceptions.HTTPError) as err: raise CLIError('Please ensure you have network connection. Error detail: {}'.format(str(err))) logger.debug('Downloaded to %s', ext_file) else: # Get file path ext_file = os.path.realpath(os.path.expanduser(source)) if not os.path.isfile(ext_file): raise CLIError("File {} not found.".format(source)) # Validate the extension logger.debug('Validating the extension {}'.format(ext_file)) try: _validate_whl_extension(ext_file) except AssertionError: logger.debug(traceback.format_exc()) raise CLIError('The extension is invalid. Use --debug for more information.') except CLIError as e: raise e logger.debug('Validation successful on {}'.format(ext_file)) # Install with pip extension_path = get_extension_path(extension_name) pip_args = ['install', '--target', extension_path, ext_file] logger.debug('Executing pip with args: %s', pip_args) with HomebrewPipPatch(): pip_status_code = _run_pip(pip_args) if pip_status_code > 0: logger.debug('Pip failed so deleting anything we might have installed at %s', extension_path) shutil.rmtree(extension_path, ignore_errors=True) raise CLIError('An error occurred. Pip failed with status code {}. ' 'Use --debug for more information.'.format(pip_status_code)) # Save the whl we used to install the extension in the extension dir. dst = os.path.join(extension_path, whl_filename) shutil.copyfile(ext_file, dst) logger.debug('Saved the whl to %s', dst)
def _add_whl_ext(source): # pylint: disable=too-many-statements import pip url_parse_result = urlparse(source) is_url = (url_parse_result.scheme == 'http' or url_parse_result.scheme == 'https') logger.debug('Extension source is url? %s', is_url) whl_filename = os.path.basename(url_parse_result.path) if is_url else os.path.basename(source) parsed_filename = WHEEL_INFO_RE(whl_filename) extension_name = parsed_filename.groupdict().get('name') if parsed_filename else None if not extension_name: raise CLIError('Unable to determine extension name from {}. Is the file name correct?'.format(source)) if extension_exists(extension_name): raise CLIError('The extension {} already exists.'.format(extension_name)) ext_file = None if is_url: # Download from URL tmp_dir = tempfile.mkdtemp() ext_file = os.path.join(tmp_dir, whl_filename) logger.debug('Downloading %s to %s', source, ext_file) try: _whl_download_from_url(url_parse_result, ext_file) except (requests.exceptions.ConnectionError, requests.exceptions.HTTPError) as err: raise CLIError('Please ensure you have network connection. Error detail: {}'.format(str(err))) logger.debug('Downloaded to %s', ext_file) else: # Get file path ext_file = os.path.realpath(os.path.expanduser(source)) if not os.path.isfile(ext_file): raise CLIError("File {} not found.".format(source)) # Validate the extension logger.debug('Validating the extension {}'.format(ext_file)) try: _validate_whl_extension(ext_file) except AssertionError: logger.debug(traceback.format_exc()) raise CLIError('The extension is invalid. Use --debug for more information.') except CLIError as e: raise e logger.debug('Validation successful on {}'.format(ext_file)) # Install with pip extension_path = get_extension_path(extension_name) pip_args = ['install', '--target', extension_path, ext_file] logger.debug('Executing pip with args: %s', pip_args) pip_status_code = _run_pip(pip, pip_args) if pip_status_code > 0: logger.debug('Pip failed so deleting anything we might have installed at %s', extension_path) shutil.rmtree(extension_path, ignore_errors=True) raise CLIError('An error occurred. Pip failed with status code {}. ' 'Use --debug for more information.'.format(pip_status_code)) # Save the whl we used to install the extension in the extension dir. dst = os.path.join(extension_path, whl_filename) shutil.copyfile(ext_file, dst) logger.debug('Saved the whl to %s', dst)
def add_extension(source=None, extension_name=None, index_url=None, yes=None, # pylint: disable=unused-argument pip_extra_index_urls=None, pip_proxy=None): ext_sha256 = None if extension_name: if extension_exists(extension_name): raise CLIError('The extension {} already exists.'.format(extension_name)) try: source, ext_sha256 = resolve_from_index(extension_name, index_url=index_url) except NoExtensionCandidatesError as err: logger.debug(err) raise CLIError("No matching extensions for '{}'. Use --debug for more information.".format(extension_name)) _add_whl_ext(source, ext_sha256=ext_sha256, pip_extra_index_urls=pip_extra_index_urls, pip_proxy=pip_proxy) _augment_telemetry_with_ext_info(extension_name)
def handler(ctx, **kwargs): cmd = kwargs.get('command', None) if cmd and cmd.startswith('iot'): if not extension_exists('azure-cli-iot-ext'): ran_before = ctx.config.getboolean('iot', 'first_run', fallback=False) if not ran_before: extension_text = """ Comprehensive IoT data-plane functionality is available in the Azure IoT CLI Extension. For more info and install guide go to https://github.com/Azure/azure-iot-cli-extension """ logger = get_logger(__name__) logger.warning(extension_text) ctx.config.set_value('iot', 'first_run', 'yes')
def handler(ctx, **kwargs): cmd = kwargs.get('command', None) if cmd and cmd.startswith('iot'): if not extension_exists('azure-cli-iot-ext'): ran_before = ctx.config.getboolean('iot', 'first_run', fallback=False) if not ran_before: extension_text = """ Comprehensive IoT data-plane functionality is available in the Azure IoT CLI Extension. For more info and install guide go to https://github.com/Azure/azure-iot-cli-extension """ logger = get_logger(__name__) logger.warning(extension_text) ctx.config.set_value('iot', 'first_run', 'yes')
def add_extension(source=None, extension_name=None, index_url=None, yes=None, # pylint: disable=unused-argument pip_extra_index_urls=None, pip_proxy=None): ext_sha256 = None if extension_name: if extension_exists(extension_name): raise CLIError('The extension {} already exists.'.format(extension_name)) try: source, ext_sha256 = resolve_from_index(extension_name, index_url=index_url) except NoExtensionCandidatesError as err: logger.debug(err) raise CLIError("No matching extensions for '{}'. Use --debug for more information.".format(extension_name)) _add_whl_ext(source, ext_sha256=ext_sha256, pip_extra_index_urls=pip_extra_index_urls, pip_proxy=pip_proxy) _augment_telemetry_with_ext_info(extension_name) try: if extension_name and get_extension(extension_name).preview: logger.warning("The installed extension '%s' is in preview.", extension_name) except ExtensionNotInstalledException: pass
def install(package, exact_version=None, compatible_version=None): if not extension_exists(EXTENSION_NAME): raise RuntimeError('iot extension is misconfigured') ext_path = get_extension_path(EXTENSION_NAME) cmd = [ sys.executable, '-m', 'pip', '--disable-pip-version-check', '--no-cache-dir', 'install', '-U', '--target', ext_path ] cmd_suffix = None if exact_version: cmd_suffix = '{}=={}'.format(package, exact_version) elif compatible_version: cmd_suffix = '{}~={}'.format(package, compatible_version) else: cmd_suffix = package cmd.append(cmd_suffix) logger.info(cmd) return subprocess.call(cmd) == 0
def test_extension_not_exists_2(self): _install_test_extension1() actual = extension_exists('notanextension') self.assertFalse(actual)
def test_extension_not_exists(self): actual = extension_exists(EXT_NAME) self.assertFalse(actual)
def test_extension_exists(self): _install_test_extension1() actual = extension_exists(EXT_NAME) self.assertTrue(actual)
def test_extension_exists(self): _install_test_extension1() actual = extension_exists(EXT_NAME, ext_type=WheelExtension) self.assertTrue(actual)
def test_extension_not_exists_2(self): _install_test_extension1() actual = extension_exists('notanextension', ext_type=WheelExtension) self.assertFalse(actual)
def test_extension_not_exists(self): actual = extension_exists(EXT_NAME, ext_type=WheelExtension) self.assertFalse(actual)
def test_extension_not_exists(self): actual = extension_exists(EXT_NAME) self.assertFalse(actual)
def test_extension_not_exists_2(self): _install_test_extension1() actual = extension_exists('notanextension') self.assertFalse(actual)
def test_extension_exists(self): _install_test_extension1() actual = extension_exists(EXT_NAME, ext_type=WheelExtension) self.assertTrue(actual)
def test_extension_not_exists_2(self): _install_test_extension1() actual = extension_exists('notanextension', ext_type=WheelExtension) self.assertFalse(actual)
def test_extension_not_exists(self): actual = extension_exists(EXT_NAME, ext_type=WheelExtension) self.assertFalse(actual)
def _add_whl_ext(source, ext_sha256=None, pip_extra_index_urls=None, pip_proxy=None): # pylint: disable=too-many-statements if not source.endswith('.whl'): raise ValueError('Unknown extension type. Only Python wheels are supported.') url_parse_result = urlparse(source) is_url = (url_parse_result.scheme == 'http' or url_parse_result.scheme == 'https') logger.debug('Extension source is url? %s', is_url) whl_filename = os.path.basename(url_parse_result.path) if is_url else os.path.basename(source) parsed_filename = WHEEL_INFO_RE(whl_filename) # Extension names can have - but .whl format changes it to _ (PEP 0427). Undo this. extension_name = parsed_filename.groupdict().get('name').replace('_', '-') if parsed_filename else None if not extension_name: raise CLIError('Unable to determine extension name from {}. Is the file name correct?'.format(source)) if extension_exists(extension_name): raise CLIError('The extension {} already exists.'.format(extension_name)) ext_file = None if is_url: # Download from URL tmp_dir = tempfile.mkdtemp() ext_file = os.path.join(tmp_dir, whl_filename) logger.debug('Downloading %s to %s', source, ext_file) try: _whl_download_from_url(url_parse_result, ext_file) except (requests.exceptions.ConnectionError, requests.exceptions.HTTPError) as err: raise CLIError('Please ensure you have network connection. Error detail: {}'.format(str(err))) logger.debug('Downloaded to %s', ext_file) else: # Get file path ext_file = os.path.realpath(os.path.expanduser(source)) if not os.path.isfile(ext_file): raise CLIError("File {} not found.".format(source)) # Validate the extension logger.debug('Validating the extension %s', ext_file) if ext_sha256: valid_checksum, computed_checksum = is_valid_sha256sum(ext_file, ext_sha256) if valid_checksum: logger.debug("Checksum of %s is OK", ext_file) else: logger.debug("Invalid checksum for %s. Expected '%s', computed '%s'.", ext_file, ext_sha256, computed_checksum) raise CLIError("The checksum of the extension does not match the expected value. " "Use --debug for more information.") try: _validate_whl_extension(ext_file) except AssertionError: logger.debug(traceback.format_exc()) raise CLIError('The extension is invalid. Use --debug for more information.') except CLIError as e: raise e logger.debug('Validation successful on %s', ext_file) # Check for distro consistency check_distro_consistency() # Install with pip extension_path = get_extension_path(extension_name) pip_args = ['install', '--target', extension_path, ext_file] if pip_proxy: pip_args = pip_args + ['--proxy', pip_proxy] if pip_extra_index_urls: for extra_index_url in pip_extra_index_urls: pip_args = pip_args + ['--extra-index-url', extra_index_url] logger.debug('Executing pip with args: %s', pip_args) with HomebrewPipPatch(): pip_status_code = _run_pip(pip_args) if pip_status_code > 0: logger.debug('Pip failed so deleting anything we might have installed at %s', extension_path) shutil.rmtree(extension_path, ignore_errors=True) raise CLIError('An error occurred. Pip failed with status code {}. ' 'Use --debug for more information.'.format(pip_status_code)) # Save the whl we used to install the extension in the extension dir. dst = os.path.join(extension_path, whl_filename) shutil.copyfile(ext_file, dst) logger.debug('Saved the whl to %s', dst)
from azure.cli.command_modules.iot.mgmt_iot_hub_device.lib.iot_hub_device_client import IotHubDeviceClient from azure.cli.command_modules.iot.mgmt_iot_hub_device.lib.models.authentication import Authentication from azure.cli.command_modules.iot.mgmt_iot_hub_device.lib.models.device_description import DeviceDescription from azure.cli.command_modules.iot.mgmt_iot_hub_device.lib.models.x509_thumbprint import X509Thumbprint from azure.cli.command_modules.iot.sas_token_auth import SasTokenAuthentication from azure.cli.core.extension import extension_exists from azure.cli.core._environment import get_config_dir from ._client_factory import resource_service_factory from ._utils import create_self_signed_certificate, open_certificate logger = get_logger(__name__) # IoT Extension run once awareness if not extension_exists('azure_cli_iot_ext'): config = CLIConfig(get_config_dir()) ran_before = config.getboolean('iot', 'first_run', fallback=False) if not ran_before: extension_text = """ Comprehensive IoT data-plane functionality is available in the Azure IoT CLI Extension. For more info and install guide go to https://github.com/Azure/azure-iot-cli-extension """ logger.warning(extension_text) config.set_value('iot', 'first_run', 'yes') # CUSTOM TYPE class KeyType(Enum): primary = 'primary'
def _add_whl_ext(cli_ctx, source, ext_sha256=None, pip_extra_index_urls=None, pip_proxy=None, system=None): # pylint: disable=too-many-statements cli_ctx.get_progress_controller().add(message='Analyzing') if not source.endswith('.whl'): raise ValueError( 'Unknown extension type. Only Python wheels are supported.') url_parse_result = urlparse(source) is_url = (url_parse_result.scheme == 'http' or url_parse_result.scheme == 'https') logger.debug('Extension source is url? %s', is_url) whl_filename = os.path.basename( url_parse_result.path) if is_url else os.path.basename(source) parsed_filename = WHEEL_INFO_RE(whl_filename) # Extension names can have - but .whl format changes it to _ (PEP 0427). Undo this. extension_name = parsed_filename.groupdict().get('name').replace( '_', '-') if parsed_filename else None if not extension_name: raise CLIError( 'Unable to determine extension name from {}. Is the file name correct?' .format(source)) if extension_exists(extension_name, ext_type=WheelExtension): raise CLIError( 'The extension {} already exists.'.format(extension_name)) if extension_name == 'rdbms-connect': _install_deps_for_psycopg2() ext_file = None if is_url: # Download from URL tmp_dir = tempfile.mkdtemp() ext_file = os.path.join(tmp_dir, whl_filename) logger.debug('Downloading %s to %s', source, ext_file) import requests try: cli_ctx.get_progress_controller().add(message='Downloading') _whl_download_from_url(url_parse_result, ext_file) except (requests.exceptions.ConnectionError, requests.exceptions.HTTPError) as err: raise CLIError( 'Please ensure you have network connection. Error detail: {}'. format(str(err))) logger.debug('Downloaded to %s', ext_file) else: # Get file path ext_file = os.path.realpath(os.path.expanduser(source)) if not os.path.isfile(ext_file): raise CLIError("File {} not found.".format(source)) # Validate the extension logger.debug('Validating the extension %s', ext_file) if ext_sha256: valid_checksum, computed_checksum = is_valid_sha256sum( ext_file, ext_sha256) if valid_checksum: logger.debug("Checksum of %s is OK", ext_file) else: logger.debug( "Invalid checksum for %s. Expected '%s', computed '%s'.", ext_file, ext_sha256, computed_checksum) raise CLIError( "The checksum of the extension does not match the expected value. " "Use --debug for more information.") try: cli_ctx.get_progress_controller().add(message='Validating') _validate_whl_extension(ext_file) except AssertionError: logger.debug(traceback.format_exc()) raise CLIError( 'The extension is invalid. Use --debug for more information.') except CLIError as e: raise e logger.debug('Validation successful on %s', ext_file) # Check for distro consistency check_distro_consistency() cli_ctx.get_progress_controller().add(message='Installing') # Install with pip extension_path = build_extension_path(extension_name, system) pip_args = ['install', '--target', extension_path, ext_file] if pip_proxy: pip_args = pip_args + ['--proxy', pip_proxy] if pip_extra_index_urls: for extra_index_url in pip_extra_index_urls: pip_args = pip_args + ['--extra-index-url', extra_index_url] logger.debug('Executing pip with args: %s', pip_args) with HomebrewPipPatch(): pip_status_code = _run_pip(pip_args, extension_path) if pip_status_code > 0: logger.debug( 'Pip failed so deleting anything we might have installed at %s', extension_path) rmtree_with_retry(extension_path) raise CLIError( 'An error occurred. Pip failed with status code {}. ' 'Use --debug for more information.'.format(pip_status_code)) # Save the whl we used to install the extension in the extension dir. dst = os.path.join(extension_path, whl_filename) shutil.copyfile(ext_file, dst) logger.debug('Saved the whl to %s', dst) return extension_name
def test_extension_exists(self): _install_test_extension1() actual = extension_exists(EXT_NAME) self.assertTrue(actual)