Esempio n. 1
0
def find_and_link(service_type, setting_name, service_id, app_name, setting):
    valid_service = validate_service_id(service_type, service_id)
    setting_type = get_setting_type_from_setting(setting)
    if valid_service:
        link_service_to_app_setting(service_type, service_id, app_name,
                                    setting_type, setting_name)
    else:
        write_error(
            f'Warning: Could not find service of type: "{service_type}" with the Name/ID: "{service_id}"'
        )
Esempio n. 2
0
def find_and_link(service_type, setting_name, service_name, app_name):

    service = get_service_from_name(service_name)
    if service:
        link_service_to_app_setting(service['service_type'], service_name,
                                    app_name, service['linkParam'],
                                    setting_name)
    else:
        write_error(
            'Warning: Could not find service of type: {} with the name/id: {}'.
            format(service_type, service_name))
Esempio n. 3
0
    def test_link_service_to_app_setting_spatial_link_does_not_exist(
            self, mock_app, mock_service, mock_setting, mock_pretty_output):
        from django.core.exceptions import ObjectDoesNotExist

        # Mock up TethysApp to MagicMock
        mock_app.objects.get.return_value = mock.MagicMock()
        # Mock up the SpatialDatasetService to MagicMock
        mock_service.objects.get.return_value = mock.MagicMock()
        # Mock up the SpatialDatasetServiceSetting to MagicMock
        mock_setting.objects.get.side_effect = ObjectDoesNotExist

        # Based on KeyError for invalid setting_type False will be returned
        result = utilities.link_service_to_app_setting(
            service_type='spatial',
            service_uid='foo_spatial_service',
            app_package='foo_app',
            setting_type='ds_spatial',
            setting_uid='456')

        self.assertEqual(False, result)
        mock_service.objects.get.assert_called_once_with(
            name='foo_spatial_service')
        mock_app.objects.get.assert_called_once_with(package='foo_app')
        mock_setting.objects.get.assert_called()
        po_call_args = mock_pretty_output().__enter__().write.call_args_list
        self.assertEqual(1, len(po_call_args))
        self.assertIn('with ID/Name', po_call_args[0][0][0])
        self.assertIn('does not exist.', po_call_args[0][0][0])
Esempio n. 4
0
    def test_link_service_to_app_setting_spatial_link_value_error_save(
            self, mock_app, mock_service, mock_setting, mock_pretty_output):
        # Mock up TethysApp to MagicMock
        mock_app.objects.get.return_value = mock.MagicMock()
        # Mock up the SpatialDatasetService to MagicMock
        mock_service.objects.get.return_value = mock.MagicMock()
        # Mock up the SpatialDatasetServiceSetting to MagicMock
        mock_setting.objects.get.return_value = mock.MagicMock()
        mock_setting.objects.get().save.return_value = True

        # True will be returned, mocked save will be called
        result = utilities.link_service_to_app_setting(
            service_type='spatial',
            service_uid='foo_spatial_service',
            app_package='foo_app',
            setting_type='ds_spatial',
            setting_uid='foo_456')

        self.assertEqual(True, result)
        mock_service.objects.get.assert_called_once_with(
            name='foo_spatial_service')
        mock_app.objects.get.assert_called_once_with(package='foo_app')
        mock_setting.objects.get.assert_called()
        mock_setting.objects.get().save.assert_called_once()
        po_call_args = mock_pretty_output().__enter__().write.call_args_list
        self.assertEqual(1, len(po_call_args))
        self.assertIn('was successfully linked to', po_call_args[0][0][0])
Esempio n. 5
0
    def test_link_service_to_app_setting_spatial_link_key_error(
            self, mock_app, mock_service, mock_pretty_output):
        # Mock up TethysApp to MagicMock
        mock_app.objects.get.return_value = mock.MagicMock()
        # Mock up the SpatialDatasetService to MagicMock
        mock_service.objects.get.return_value = mock.MagicMock()

        # Based on KeyError for invalid setting_type False will be returned
        result = utilities.link_service_to_app_setting(
            service_type='spatial',
            service_uid='foo_spatial_service',
            app_package='foo_app',
            setting_type='foo_invalid',
            setting_uid='456')

        self.assertEqual(False, result)
        mock_service.objects.get.assert_called_once_with(
            name='foo_spatial_service')
        mock_app.objects.get.assert_called_once_with(package='foo_app')
        po_call_args = mock_pretty_output().__enter__().write.call_args_list
        self.assertEqual(1, len(po_call_args))
        self.assertIn(
            'The setting_type you specified ("foo_invalid") does not exist.',
            po_call_args[0][0][0])
        self.assertIn('Choose from: "ps_database|ps_connection|ds_spatial"',
                      po_call_args[0][0][0])
Esempio n. 6
0
    def test_link_service_to_app_setting_spatial_dss_value_error(
            self, mock_app, mock_service, mock_pretty_output):
        from django.core.exceptions import ObjectDoesNotExist

        # Mock up TethysApp to throw ObjectDoesNotExist
        mock_app.objects.get.side_effect = ObjectDoesNotExist
        # Mock up the SpatialDatasetService to MagicMock
        mock_service.objects.get.return_value = mock.MagicMock()

        # Based on ValueError exception casting to int, then TethysApp ObjectDoesNotExist False will be returned
        result = utilities.link_service_to_app_setting(
            service_type='spatial',
            service_uid='foo_spatial_service',
            app_package='foo_app',
            setting_type='ds_spatial',
            setting_uid='456')

        self.assertEqual(False, result)
        mock_service.objects.get.assert_called_once_with(
            name='foo_spatial_service')
        mock_app.objects.get.assert_called_once_with(package='foo_app')
        po_call_args = mock_pretty_output().__enter__().write.call_args_list
        self.assertEqual(1, len(po_call_args))
        self.assertIn('A Tethys App with the name', po_call_args[0][0][0])
        self.assertIn('does not exist. Aborted.', po_call_args[0][0][0])
def configure_services(services_data, channel_layer):
    try:
        link_service_to_app_setting(services_data['service_type'],
                                    services_data['service_id'],
                                    services_data['app_name'],
                                    services_data['setting_type'],
                                    services_data['service_name'])
    except Exception as e:
        logger.error(e)
        logger.error("Error while linking service")
        return

    get_data_json = {
        "data": {
            "serviceName": services_data['service_name']
        },
        "jsHelperFunction": "serviceConfigComplete"
    }
    send_notification(get_data_json, channel_layer)
Esempio n. 8
0
    def test_link_service_to_app_setting_spatial_dss_does_not_exist(self, mock_service, mock_pretty_output):
        from django.core.exceptions import ObjectDoesNotExist

        # Mock up the SpatialDatasetService to throw ObjectDoesNotExist
        mock_service.objects.get.side_effect = ObjectDoesNotExist

        # Based on exception, False will be returned
        result = utilities.link_service_to_app_setting(service_type='spatial', service_uid='123',
                                                       app_package='foo_app', setting_type='ds_spatial',
                                                       setting_uid='456')

        self.assertEqual(False, result)
        mock_service.objects.get.assert_called_once_with(pk=123)
        po_call_args = mock_pretty_output().__enter__().write.call_args_list
        self.assertEqual(1, len(po_call_args))
        self.assertIn('with ID/Name', po_call_args[0][0][0])
        self.assertIn('does not exist.', po_call_args[0][0][0])
Esempio n. 9
0
    def test_link_service_to_app_setting_spatial_dss_does_not_exist(self, mock_service, mock_pretty_output):
        from django.core.exceptions import ObjectDoesNotExist

        # Mock up the SpatialDatasetService to throw ObjectDoesNotExist
        mock_service.objects.get.side_effect = ObjectDoesNotExist

        # Based on exception, False will be returned
        result = utilities.link_service_to_app_setting(service_type='spatial', service_uid='123',
                                                       app_package='foo_app', setting_type='ds_spatial',
                                                       setting_uid='456')

        self.assertEqual(False, result)
        mock_service.objects.get.assert_called_once_with(pk=123)
        po_call_args = mock_pretty_output().__enter__().write.call_args_list
        self.assertEqual(1, len(po_call_args))
        self.assertIn('with ID/Name', po_call_args[0][0][0])
        self.assertIn('does not exist.', po_call_args[0][0][0])
Esempio n. 10
0
def link_command(args):
    """
    Interact with Tethys Services (Spatial/Persistent Stores) to create them and/or link them to existing apps
    """
    try:
        service = args.service
        setting = args.setting

        service_parts = service.split(':')
        setting_parts = setting.split(':')
        service_type = None
        service_uid = None
        setting_app_package = None
        setting_type = None
        setting_uid = None

        try:
            service_type = service_parts[0]
            service_uid = service_parts[1]

            setting_app_package = setting_parts[0]
            setting_type = setting_parts[1]
            setting_uid = setting_parts[2]
        except IndexError:
            with pretty_output(FG_RED) as p:
                p.write(
                    'Incorrect argument format. \nUsage: "tethys link <spatial|persistent>:<service_id|service_name> '
                    '<app_package>:<setting_type (ps_database|ps_connection|ds_spatial)><setting_id|setting_name>"'
                    '\nCommand aborted.')
            exit(1)

        success = link_service_to_app_setting(service_type, service_uid,
                                              setting_app_package,
                                              setting_type, setting_uid)

        if not success:
            exit(1)

        exit(0)

    except Exception as e:
        with pretty_output(FG_RED) as p:
            p.write(e)
            p.write('An unexpected error occurred. Please try again.')
        exit(1)
Esempio n. 11
0
    def test_link_service_to_app_setting_spatial_link_key_error(self, mock_app, mock_service, mock_pretty_output):
        # Mock up TethysApp to MagicMock
        mock_app.objects.get.return_value = mock.MagicMock()
        # Mock up the SpatialDatasetService to MagicMock
        mock_service.objects.get.return_value = mock.MagicMock()

        # Based on KeyError for invalid setting_type False will be returned
        result = utilities.link_service_to_app_setting(service_type='spatial', service_uid='foo_spatial_service',
                                                       app_package='foo_app', setting_type='foo_invalid',
                                                       setting_uid='456')

        self.assertEqual(False, result)
        mock_service.objects.get.assert_called_once_with(name='foo_spatial_service')
        mock_app.objects.get.assert_called_once_with(package='foo_app')
        po_call_args = mock_pretty_output().__enter__().write.call_args_list
        self.assertEqual(1, len(po_call_args))
        self.assertIn('The setting_type you specified ("foo_invalid") does not exist.', po_call_args[0][0][0])
        self.assertIn('Choose from: "ps_database|ps_connection|ds_spatial"', po_call_args[0][0][0])
Esempio n. 12
0
def link_command(args):
    """
    Interact with Tethys Services (Spatial/Persistent Stores) to create them and/or link them to existing apps
    """
    try:
        service = args.service
        setting = args.setting

        service_parts = service.split(':')
        setting_parts = setting.split(':')
        service_type = None
        service_uid = None
        setting_app_package = None
        setting_type = None
        setting_uid = None

        try:
            service_type = service_parts[0]
            service_uid = service_parts[1]

            setting_app_package = setting_parts[0]
            setting_type = setting_parts[1]
            setting_uid = setting_parts[2]
        except IndexError:
            with pretty_output(FG_RED) as p:
                p.write(
                    'Incorrect argument format. \nUsage: "tethys link <spatial|persistent>:<service_id|service_name> '
                    '<app_package>:<setting_type (ps_database|ps_connection|ds_spatial)><setting_id|setting_name>"'
                    '\nCommand aborted.')
            exit(1)

        success = link_service_to_app_setting(service_type, service_uid, setting_app_package, setting_type, setting_uid)

        if not success:
            exit(1)

        exit(0)

    except Exception as e:
        with pretty_output(FG_RED) as p:
            p.write(e)
            p.write('An unexpected error occurred. Please try again.')
        exit(1)
Esempio n. 13
0
    def test_link_service_to_app_setting_spatial_dss_value_error(self, mock_app, mock_service, mock_pretty_output):
        from django.core.exceptions import ObjectDoesNotExist

        # Mock up TethysApp to throw ObjectDoesNotExist
        mock_app.objects.get.side_effect = ObjectDoesNotExist
        # Mock up the SpatialDatasetService to MagicMock
        mock_service.objects.get.return_value = mock.MagicMock()

        # Based on ValueError exception casting to int, then TethysApp ObjectDoesNotExist False will be returned
        result = utilities.link_service_to_app_setting(service_type='spatial', service_uid='foo_spatial_service',
                                                       app_package='foo_app', setting_type='ds_spatial',
                                                       setting_uid='456')

        self.assertEqual(False, result)
        mock_service.objects.get.assert_called_once_with(name='foo_spatial_service')
        mock_app.objects.get.assert_called_once_with(package='foo_app')
        po_call_args = mock_pretty_output().__enter__().write.call_args_list
        self.assertEqual(1, len(po_call_args))
        self.assertIn('A Tethys App with the name', po_call_args[0][0][0])
        self.assertIn('does not exist. Aborted.', po_call_args[0][0][0])
Esempio n. 14
0
    def test_link_service_to_app_setting_spatial_link_value_error_save(self, mock_app, mock_service, mock_setting,
                                                                       mock_pretty_output):
        # Mock up TethysApp to MagicMock
        mock_app.objects.get.return_value = mock.MagicMock()
        # Mock up the SpatialDatasetService to MagicMock
        mock_service.objects.get.return_value = mock.MagicMock()
        # Mock up the SpatialDatasetServiceSetting to MagicMock
        mock_setting.objects.get.return_value = mock.MagicMock()
        mock_setting.objects.get().save.return_value = True

        # True will be returned, mocked save will be called
        result = utilities.link_service_to_app_setting(service_type='spatial', service_uid='foo_spatial_service',
                                                       app_package='foo_app', setting_type='ds_spatial',
                                                       setting_uid='foo_456')

        self.assertEqual(True, result)
        mock_service.objects.get.assert_called_once_with(name='foo_spatial_service')
        mock_app.objects.get.assert_called_once_with(package='foo_app')
        mock_setting.objects.get.assert_called()
        mock_setting.objects.get().save.assert_called_once()
        po_call_args = mock_pretty_output().__enter__().write.call_args_list
        self.assertEqual(1, len(po_call_args))
        self.assertIn('was successfully linked to', po_call_args[0][0][0])
Esempio n. 15
0
    def test_link_service_to_app_setting_spatial_link_does_not_exist(self, mock_app, mock_service, mock_setting,
                                                                     mock_pretty_output):
        from django.core.exceptions import ObjectDoesNotExist

        # Mock up TethysApp to MagicMock
        mock_app.objects.get.return_value = mock.MagicMock()
        # Mock up the SpatialDatasetService to MagicMock
        mock_service.objects.get.return_value = mock.MagicMock()
        # Mock up the SpatialDatasetServiceSetting to MagicMock
        mock_setting.objects.get.side_effect = ObjectDoesNotExist

        # Based on KeyError for invalid setting_type False will be returned
        result = utilities.link_service_to_app_setting(service_type='spatial', service_uid='foo_spatial_service',
                                                       app_package='foo_app', setting_type='ds_spatial',
                                                       setting_uid='456')

        self.assertEqual(False, result)
        mock_service.objects.get.assert_called_once_with(name='foo_spatial_service')
        mock_app.objects.get.assert_called_once_with(package='foo_app')
        mock_setting.objects.get.assert_called()
        po_call_args = mock_pretty_output().__enter__().write.call_args_list
        self.assertEqual(1, len(po_call_args))
        self.assertIn('with ID/Name', po_call_args[0][0][0])
        self.assertIn('does not exist.', po_call_args[0][0][0])
Esempio n. 16
0
def run_interactive_services(app_name):
    write_msg(
        'Running Interactive Service Mode. '
        'Any configuration options in services.yml or portal_config.yml will be ignored...'
    )
    write_msg('Hit return at any time to skip a step.')

    app_settings = get_app_settings(app_name)

    # In the case the app isn't installed, has no settings, or it is an extension,
    # skip configuring services/settings
    if not app_settings:
        write_msg(
            f'No settings found for app "{app_name}". Skipping interactive configuration...'
        )
        return

    unlinked_settings = app_settings['unlinked_settings']

    for setting in unlinked_settings:
        valid = False
        configure_text = "Configuring {}".format(setting.name)
        star_out = '*' * len(configure_text)
        write_msg(f"\n{star_out}\n{configure_text}\n{star_out}")
        write_msg(f"Type: {setting.__class__.__name__}\n"
                  f"Description: {setting.description}\n"
                  f"Required: {setting.required}")
        if hasattr(setting, 'value'):
            while not valid:
                write_msg(
                    '\nEnter the desired value for the current custom setting: {}'
                    .format(setting.name))
                try:
                    value = get_interactive_input()
                    if value != "":
                        try:
                            setting.value = value
                            setting.clean()
                            setting.save()
                            valid = True
                            write_success(
                                "{} successfully set with value: {}.".format(
                                    setting.name, value))
                        except ValidationError:
                            write_error(
                                "Incorrect value type given for custom setting '{}'. Please try again"
                                .format(setting.name))

                    else:
                        write_msg("Skipping setup of {}".format(setting.name))
                        valid = True

                except (KeyboardInterrupt, SystemExit):
                    write_msg('\nInstall Command cancelled.')
                    exit(0)
        else:
            # List existing services
            args = Namespace()

            for conf in ['spatial', 'persistent', 'wps', 'dataset']:
                setattr(args, conf, False)

            setattr(args, get_setting_type(setting), True)
            services = services_list_command(args)[0]

            if len(services) <= 0:
                write_warning(
                    'No compatible services found. See:\n\n  tethys services create {} -h\n'
                    .format(get_setting_type(setting)))
                continue

            while not valid:
                write_msg(
                    '\nEnter the service ID/Name to link to the current service setting: {}.'
                    .format(setting.name))
                try:
                    service_id = get_interactive_input()
                    if service_id != "":
                        try:
                            setting_type = get_setting_type_from_setting(
                                setting)
                            service_type = get_service_type_from_setting(
                                setting)
                        except RuntimeError as e:
                            write_error(str(e) + ' Skipping...')
                            break

                        # Validate the given service id
                        valid_service = validate_service_id(
                            service_type, service_id)

                        if valid_service:
                            link_service_to_app_setting(
                                service_type, service_id, app_name,
                                setting_type, setting.name)

                            valid = True
                        else:
                            write_error(
                                'Incorrect service ID/Name. Please try again.')

                    else:
                        write_msg("Skipping setup of {}".format(setting.name))
                        valid = True

                except (KeyboardInterrupt, SystemExit):
                    write_msg('\nInstall Command cancelled.')
                    exit(0)