def test_provider_mapper_insert(api_db): mapper = mappers.Providers(api_db) provider = _make_provider() assert provider.provider_id is None provider_id = mapper.insert(provider) assert provider_id is not None try: # Exists and is set assert provider.provider_id == provider_id # Pull the document doc = api_db.providers.find_one({'_id': provider_id}) assert doc assert doc['_id'] == provider_id assert 'created' in doc assert 'modified' in doc assert isinstance(doc['created'], datetime.datetime) assert isinstance(doc['modified'], datetime.datetime) assert doc['provider_class'] == provider.provider_class assert doc['provider_type'] == provider.provider_type assert doc['label'] == provider.label assert doc['origin'] == origin #assert doc['config'] == provider_config finally: # Cleanup api_db.providers.remove({'_id': provider_id})
def test_provider_repository_load(api_db): compute_provider = _make_compute_provider() storage_provider = _make_storage_provider() mapper = mappers.Providers() cid = mapper.insert(compute_provider) sid = mapper.insert(storage_provider) try: # Not found with pytest.raises(errors.ResourceNotFound): providers.get_provider(bson.ObjectId()) with pytest.raises(errors.ResourceNotFound): providers.get_provider_config(bson.ObjectId()) # Load with get_provider result = providers.get_provider(str(sid)) expected = storage_provider._schema.dump(storage_provider).data #del expected['config'] assert result._schema.dump(result).data == expected # Load all results = list(providers.get_providers()) # These are the defaults so exclude from our tests if present final_results = []; for result in results: if not (result.label == 'Primary Storage' or result.label == 'Static Compute'): final_results.append(result) # Adjust once the compute providers are ready assert len(final_results) == 2 # Load by type results = list(providers.get_providers('storage')) assert len(results) >= 1 final_results = [] for result in results: final_results.append(result._schema.dump(result).data) assert expected in final_results # Load redacted config result = providers.get_provider_config(sid) assert result == {'id': storage_provider.provider_id, 'path': '/var'} # Load full provider config result = providers.get_provider_config(cid, full=True) assert result == {'config': compute_provider.config, 'creds': {}} # Creds are empty but still returned in full config finally: # Cleanup api_db.providers.remove({'_id': cid}) api_db.providers.remove({'_id': sid})
def test_provider_repository_insert_and_update(api_db): # Invalid provider type provider = _make_provider(ProviderClass.storage.value) provider.provider_class = 'garbage' with pytest.raises(Exception): providers.insert_provider(provider) # Invalid provider config... needs more than just the baes implementation provider = _make_storage_provider() provider.config = {} with pytest.raises(errors.ValidationError): providers.insert_provider(provider) # Valid provider config provider = _make_storage_provider() provider_id = providers.insert_provider(provider) assert provider_id is not None try: # Load from data store mapper = mappers.Providers() result = mapper.get(provider_id) assert result._schema.dump(result) == provider._schema.dump(provider) # Try to update non-existent with pytest.raises(errors.ResourceNotFound): providers.update_provider(bson.ObjectId(), {'label': 'New Label'}) # Try to update provider class with pytest.raises(errors.ValidationError): providers.update_provider(str(provider_id), {'provider_class': 'compute'}) # Try to update provider type with pytest.raises(errors.ValidationError): providers.update_provider(str(provider_id), {'provider_type': 'garbage'}) # Try to set invalid config with pytest.raises(errors.ValidationError): providers.update_provider(provider_id, {'config': {'x':'y'}}) # Successful update providers.update_provider(provider_id, {'label': 'New Label', 'config': {'path': '/var'}}) result = mapper.get(provider_id) assert result.config == {'path': u'/var'} assert result.label == 'New Label' finally: api_db.providers.remove({'_id': provider_id})
def test_provider_mapper_find_all(api_db): # The base provider does not have the needed items to be persisted sucessfully compute_provider = _make_compute_provider() storage_provider = _make_storage_provider() mapper = mappers.Providers(api_db) cid = mapper.insert(compute_provider) sid = mapper.insert(storage_provider) try: results = list(mapper.find_all(ProviderClass.storage)) # This provider is the default site provider so exclude it from our tests if present final_results = [] for result in results: if result.label != 'Primary Storage': final_results.append(result) assert len(final_results) == 1 assert final_results[0]._schema.dump(final_results[0]) == storage_provider._schema.dump(storage_provider) results = list(mapper.find_all(ProviderClass.compute.value)) assert len(results) >= 1 expected_results = compute_provider._schema.dump(compute_provider).data final_results = [] for result in results: final_results.append(result._schema.dump(result).data) assert expected_results in final_results results = list(mapper.find_all('nothing')) assert len(results) == 0 results = list(mapper.find_all()) final_results = [] for result in results: if not (result.label == 'Primary Storage' or result.label == 'Static Compute'): final_results.append(result) assert len(final_results) == 2 finally: # Cleanup api_db.providers.remove({'_id': cid}) api_db.providers.remove({'_id': sid})
def test_storage_provider_mapper_patch(api_db): # Insert provider mapper = mappers.Providers(api_db) provider = _make_storage_provider() provider_id = mapper.insert(provider) try: config2 = {'path': '/var/scitran'} provider.label = 'My Provider' provider.config = config2 mapper.patch(provider_id, provider) # Find by ObjectId result = mapper.get(provider_id) assert result.modified >= result.created assert result.label == 'My Provider' assert result.config == config2 assert result.provider_class == ProviderClass.storage.value finally: # Cleanup api_db.providers.remove({'_id': provider_id})
def test_storage_provider_mapper_get(api_db): # Insert provider mapper = mappers.Providers(api_db) provider = _make_storage_provider() provider_id = mapper.insert(provider) try: # Find by arbitrary object id (None) result = mapper.get(bson.ObjectId()) assert result is None # Find by ObjectId result = mapper.get(provider_id) assert result is not None assert result.provider_id == provider_id assert provider._schema.dump(result) == provider._schema.dump(provider) # Find by string result = mapper.get(str(provider_id)) assert provider._schema.dump(result) == provider._schema.dump(provider) finally: # Cleanup api_db.providers.remove({'_id': provider_id})
def test_validate_provider_updates(api_db): compute_provider = _make_compute_provider() compute_provider2 = _make_compute_provider() storage_provider = _make_storage_provider() storage_provider2 = _make_storage_provider() mapper = mappers.Providers() cid = mapper.insert(compute_provider) cid2 = mapper.insert(compute_provider2) sid = mapper.insert(storage_provider) sid2 = mapper.insert(storage_provider2) try: # Starting from empty container container = {} # No providers updates = None providers.validate_provider_updates(container, updates, False) providers.validate_provider_updates(container, updates, True) # Empty providers updates = {} providers.validate_provider_updates(container, updates, False) providers.validate_provider_updates(container, updates, True) # Validate compute provider id updates = {'compute': bson.ObjectId()} with pytest.raises(errors.ResourceNotFound): providers.validate_provider_updates(container, updates, True) # Validate storage provider id updates = {'storage': bson.ObjectId()} with pytest.raises(errors.ResourceNotFound): providers.validate_provider_updates(container, updates, True) # String id for compute provider updates = {'compute': str(cid)} providers.validate_provider_updates(container, updates, True) assert isinstance(updates['compute'], bson.ObjectId) # Setting providers for the first time is not allowed for users with pytest.raises(errors.PermissionError): providers.validate_provider_updates(container, updates, False) # Setting providers for the first time is allowed for admins providers.validate_provider_updates(container, updates, True) # Changing providers is not allowed for users container = {'providers': {'compute': cid2}} with pytest.raises(errors.ValidationError): providers.validate_provider_updates(container, updates, False) # Changing providers is not allowed container = {'providers': {'compute': cid2}} with pytest.raises(errors.ValidationError): providers.validate_provider_updates(container, updates, True) # No-change is OK container = {'providers': {'compute': cid}} providers.validate_provider_updates(container, updates, False) # String id for storage provider container = {} updates = {'storage': str(sid)} providers.validate_provider_updates(container, updates, True) assert isinstance(updates['storage'], bson.ObjectId) # Setting providers for the first time is not allowed for users with pytest.raises(errors.PermissionError): providers.validate_provider_updates(container, updates, False) # No-change is OK container = {'providers': {'storage': sid}} providers.validate_provider_updates(container, updates, False) # Cannot change after set as admin container = {'providers': {'storage': bson.ObjectId()}} with pytest.raises(errors.ValidationError): providers.validate_provider_updates(container, updates, True) # Cannot change after set as user container = {'providers': {'storage': bson.ObjectId()}} with pytest.raises(errors.ValidationError): providers.validate_provider_updates(container, updates, False) updates = {'compute': str(cid)} container = {'providers': {'compute': bson.ObjectId()}} with pytest.raises(errors.ValidationError): providers.validate_provider_updates(container, updates, True) # Invalid provider type tests updates = {'storage': cid} container = {} with pytest.raises(errors.ValidationError): providers.validate_provider_updates(container, updates, True) updates = {'compute': sid} container = {} with pytest.raises(errors.ValidationError): providers.validate_provider_updates(container, updates, True) finally: # Cleanup api_db.providers.remove({'_id': cid}) api_db.providers.remove({'_id': sid})