예제 #1
0
    def test_return_none_if_custom_settings_not_defined(self):
        load_from_file_mock = MagicMock(return_value=None)
        input_args = MagicMock(**{})

        with patch('conductr_cli.custom_settings.load_from_file', load_from_file_mock):
            result = custom_settings.load_bintray_webhook_secret(input_args)

        load_from_file_mock.assert_called_with(input_args)

        self.assertIsNone(result)
예제 #2
0
    def test_return_none_if_custom_settings_not_defined(self):
        load_from_file_mock = MagicMock(return_value=None)
        input_args = MagicMock(**{})

        with patch('conductr_cli.custom_settings.load_from_file',
                   load_from_file_mock):
            result = custom_settings.load_bintray_webhook_secret(input_args)

        load_from_file_mock.assert_called_with(input_args)

        self.assertIsNone(result)
예제 #3
0
    def test_return_none_if_webhook_not_configured(self):
        test_custom_settings = ConfigFactory.parse_string(
            strip_margin("""|abc {
                            |  def = 123
                            |}"""))
        load_from_file_mock = MagicMock(return_value=test_custom_settings)
        input_args = MagicMock(**{})

        with patch('conductr_cli.custom_settings.load_from_file',
                   load_from_file_mock):
            result = custom_settings.load_bintray_webhook_secret(input_args)

        load_from_file_mock.assert_called_with(input_args)

        self.assertIsNone(result)
예제 #4
0
    def test_return_none_if_webhook_not_configured(self):
        test_custom_settings = ConfigFactory.parse_string(
            strip_margin("""|abc {
                            |  def = 123
                            |}""")
        )
        load_from_file_mock = MagicMock(return_value=test_custom_settings)
        input_args = MagicMock(**{})

        with patch('conductr_cli.custom_settings.load_from_file', load_from_file_mock):
            result = custom_settings.load_bintray_webhook_secret(input_args)

        load_from_file_mock.assert_called_with(input_args)

        self.assertIsNone(result)
예제 #5
0
    def test_return_secret(self):
        test_custom_settings = ConfigFactory.parse_string(
            strip_margin("""|conductr {
                            |  continuous-delivery {
                            |    bintray-webhook-secret = secret
                            |  }
                            |}
                            |"""))
        load_from_file_mock = MagicMock(return_value=test_custom_settings)
        input_args = MagicMock(**{})

        with patch('conductr_cli.custom_settings.load_from_file',
                   load_from_file_mock):
            result = custom_settings.load_bintray_webhook_secret(input_args)

        load_from_file_mock.assert_called_with(input_args)

        self.assertEqual('secret', result)
예제 #6
0
    def test_return_secret(self):
        test_custom_settings = ConfigFactory.parse_string(
            strip_margin("""|conductr {
                            |  continuous-delivery {
                            |    bintray-webhook-secret = secret
                            |  }
                            |}
                            |""")
        )
        load_from_file_mock = MagicMock(return_value=test_custom_settings)
        input_args = MagicMock(**{})

        with patch('conductr_cli.custom_settings.load_from_file', load_from_file_mock):
            result = custom_settings.load_bintray_webhook_secret(input_args)

        load_from_file_mock.assert_called_with(input_args)

        self.assertEqual('secret', result)
예제 #7
0
def deploy(args):
    """`conduct deploy` command"""

    log = logging.getLogger(__name__)

    bintray_webhook_secret = custom_settings.load_bintray_webhook_secret(args)
    if not bintray_webhook_secret:
        log.error(
            'The deploy command requires bintray webhook secret to be configured'
        )
        log.error('Add the following configuration to the '
                  'custom settings file {}'.format(
                      vars(args).get('custom_settings_file')))
        log.error(
            '  conductr.continuous-delivery.bintray-webhook-secret = "configured-continuous-delivery-secret"'
        )
        return

    resolved_version = resolver.resolve_bundle_version(args.custom_settings,
                                                       args.bundle)
    if not resolved_version:
        log.error('Unable to resolve bundle {}'.format(args.bundle))
        return

    # Build Continuous Delivery URL using our resolver mechanism
    deploy_uri = resolver.continuous_delivery_uri(args.custom_settings,
                                                  resolved_version)
    if not deploy_uri:
        log.error('Unable to form Continuous Delivery uri for {}'.format(
            args.bundle))
        return

    # Confirm with the user unless auto deploy is enabled
    accepted = True if args.auto_deploy else request_deploy_confirmation(
        resolved_version, args)
    if not accepted:
        log.info('Abort')
        return

    url = conduct_url.url(deploy_uri, args)

    # JSON Payload for deployment request
    payload = {
        'package':
        resolved_version['package_name'],
        'version':
        '{}-{}'.format(resolved_version['compatibility_version'],
                       resolved_version['digest'])
    }

    # HTTP headers required for deployment request
    hmac_digest = bundle_deploy.generate_hmac_signature(
        bintray_webhook_secret, resolved_version['package_name'])
    headers = {'X-Bintray-WebHook-Hmac': hmac_digest}

    response = conduct_request.post(args.dcos_mode,
                                    conductr_host(args),
                                    url,
                                    json=payload,
                                    headers=headers,
                                    auth=args.conductr_auth,
                                    verify=args.server_verification_file)

    validation.raise_for_status_inc_3xx(response)

    deployment_id = response.text

    log.info('Deployment request sent.')
    log.info('Deployment id {}'.format(deployment_id))

    if not args.no_wait:
        bundle_deploy.wait_for_deployment_complete(deployment_id,
                                                   resolved_version, args)

    return True
예제 #8
0
def deploy(args):
    """`conduct deploy` command"""

    log = logging.getLogger(__name__)

    bintray_webhook_secret = custom_settings.load_bintray_webhook_secret(args)
    if not bintray_webhook_secret:
        log.error('The deploy command requires bintray webhook secret to be configured')
        log.error('Add the following configuration to the '
                  'custom settings file {}'.format(vars(args).get('custom_settings_file')))
        log.error('  conductr.continuous-delivery.bintray-webhook-secret = "configured-continuous-delivery-secret"')
        return

    resolved_version = resolver.resolve_bundle_version(args.custom_settings, args.bundle)
    if not resolved_version:
        log.error('Unable to resolve bundle {}'.format(args.bundle))
        return

    # Build Continuous Delivery URL using our resolver mechanism
    deploy_uri = resolver.continuous_delivery_uri(args.custom_settings, resolved_version)
    if not deploy_uri:
        log.error('Unable to form Continuous Delivery uri for {}'.format(args.bundle))
        return

    # Confirm with the user unless auto deploy is enabled
    accepted = True if args.auto_deploy else request_deploy_confirmation(resolved_version, args)
    if not accepted:
        log.info('Abort')
        return

    url = conduct_url.url(deploy_uri, args)

    # JSON Payload for deployment request
    payload = {
        'package': resolved_version['package_name'],
        'version': '{}-{}'.format(resolved_version['compatibility_version'], resolved_version['digest'])
    }

    # HTTP headers required for deployment request
    hmac_digest = bundle_deploy.generate_hmac_signature(bintray_webhook_secret, resolved_version['package_name'])
    headers = {
        'X-Bintray-WebHook-Hmac': hmac_digest
    }

    response = conduct_request.post(args.dcos_mode, conductr_host(args), url,
                                    json=payload,
                                    headers=headers,
                                    auth=args.conductr_auth,
                                    verify=args.server_verification_file)

    validation.raise_for_status_inc_3xx(response)

    deployment_id = response.text

    log.info('Deployment request sent.')
    log.info('Deployment id {}'.format(deployment_id))

    if not args.no_wait:
        bundle_deploy.wait_for_deployment_complete(deployment_id, resolved_version, args)

    return True