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}"' )
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))
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])
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])
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])
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)
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])
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)
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])
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 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])
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])
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)