package com.thinkbiganalytics.metadata.modeshape.sla;
/*-
* #%L
* thinkbig-metadata-modeshape
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import com.thinkbiganalytics.metadata.api.MetadataAccess;
import com.thinkbiganalytics.metadata.api.category.Category;
import com.thinkbiganalytics.metadata.api.category.CategoryProvider;
import com.thinkbiganalytics.metadata.api.extension.ExtensibleEntity;
import com.thinkbiganalytics.metadata.api.extension.ExtensibleEntityProvider;
import com.thinkbiganalytics.metadata.api.extension.ExtensibleTypeProvider;
import com.thinkbiganalytics.metadata.api.feed.Feed;
import com.thinkbiganalytics.metadata.api.feed.FeedProvider;
import com.thinkbiganalytics.metadata.api.sla.FeedServiceLevelAgreement;
import com.thinkbiganalytics.metadata.api.sla.FeedServiceLevelAgreementProvider;
import com.thinkbiganalytics.metadata.modeshape.JcrMetadataAccess;
import com.thinkbiganalytics.metadata.modeshape.JcrTestConfig;
import com.thinkbiganalytics.metadata.modeshape.ModeShapeEngineConfig;
import com.thinkbiganalytics.metadata.modeshape.category.JcrCategory;
import com.thinkbiganalytics.metadata.modeshape.feed.JcrFeed;
import com.thinkbiganalytics.metadata.modeshape.security.AdminCredentials;
import com.thinkbiganalytics.metadata.sla.api.ServiceLevelAgreement;
import com.thinkbiganalytics.metadata.sla.spi.ServiceLevelAgreementProvider;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.testng.Assert;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.inject.Inject;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {ModeShapeEngineConfig.class, JcrTestConfig.class})
@ComponentScan(basePackages = {"com.thinkbiganalytics.metadata.modeshape.op"})
public class JcrFeedSlaTest {
private static String FEED_SLA = "feedSla";
@Inject
CategoryProvider categoryProvider;
@Inject
FeedProvider feedProvider;
@Inject
ServiceLevelAgreementProvider slaProvider;
@Inject
FeedServiceLevelAgreementProvider feedSlaProvider;
@Inject
private ExtensibleTypeProvider typeProvider;
@Inject
private ExtensibleEntityProvider entityProvider;
@Inject
private JcrMetadataAccess metadata;
public Set<Feed.ID> createFeeds(int number) {
Set<Feed.ID> feedIds = new HashSet<>();
String categorySystemName = "my_category";
for (int i = 0; i < number; i++) {
JcrFeed.FeedId feedId = createFeed(categorySystemName, "my_feed" + i);
feedIds.add(feedId);
}
return feedIds;
}
public JcrFeed.FeedId createFeed(final String categorySystemName, final String feedSystemName) {
Category category = metadata.commit(() -> {
JcrCategory cat = (JcrCategory) categoryProvider.ensureCategory(categorySystemName);
cat.setDescription(categorySystemName + " desc");
cat.setTitle(categorySystemName);
categoryProvider.update(cat);
return cat;
}, MetadataAccess.ADMIN);
return metadata.commit(() -> {
JcrCategory cat = (JcrCategory) categoryProvider.ensureCategory(categorySystemName);
JcrFeed feed = (JcrFeed) feedProvider.ensureFeed(categorySystemName, feedSystemName, feedSystemName + " desc");
feed.setTitle(feedSystemName);
return feed.getId();
}, MetadataAccess.ADMIN);
}
@Before
public void setUp() throws Exception {
JcrFeedServiceLevelAgreementProvider jcrFeedSlaProvider = (JcrFeedServiceLevelAgreementProvider) feedSlaProvider;
jcrFeedSlaProvider.createType();
}
@Test
public void testCreateFeedSLAEntity() {
//create 2 feeds
final int numberOfFeeds = 2;
Set<Feed.ID> feedIds = createFeeds(numberOfFeeds);
final String feedSlaTitle = "My New SLA";
final String nonFeedSlaTitle = "No Feed SLA";
ExtensibleEntity.ID feedSlaEntityId = createFeedSLAEntity(feedIds, feedSlaTitle);
ServiceLevelAgreement.ID nonFeedSla = createGenericSla(nonFeedSlaTitle);
ServiceLevelAgreement.ID slaId = metadata.read(new AdminCredentials(), () -> {
JcrFeedServiceLevelAgreementProvider jcrFeedSlaProvider = (JcrFeedServiceLevelAgreementProvider) feedSlaProvider;
//ASSERT everything is good
//Assert query returns the correct result
List<ExtensibleEntity> entities = jcrFeedSlaProvider.findAllRelationships();
Assert.assertEquals(entities.size(), 1);
//Assert relationships are correct
JcrFeedServiceLevelAgreementRelationship entity = (JcrFeedServiceLevelAgreementRelationship) jcrFeedSlaProvider.getRelationship(feedSlaEntityId);
ServiceLevelAgreement feedSla = entity.getAgreement();
Assert.assertNotNull(feedSla);
List<? extends ServiceLevelAgreement> agreements = slaProvider.getAgreements();
//assert both agreements are there
Assert.assertEquals(agreements.size(), 2);
Set<JcrFeed> feeds = entity.getPropertyAsSet(JcrFeedServiceLevelAgreementRelationship.FEEDS, JcrFeed.class);
Assert.assertEquals(feeds.size(), numberOfFeeds);
for (JcrFeed feed : feeds) {
Assert.assertTrue(feedIds.contains(feed.getId()));
}
//find it by the SLA now
JcrFeedServiceLevelAgreementRelationship finalFeedSla = (JcrFeedServiceLevelAgreementRelationship) jcrFeedSlaProvider.findRelationship(feedSla.getId());
Assert.assertNotNull(finalFeedSla);
//query for SLA objects and assert the result is correct
List<FeedServiceLevelAgreement> feedAgreements = jcrFeedSlaProvider.findAllAgreements();
Assert.assertEquals(feedAgreements.size(), 1);
int nonFeedSlaCount = 0;
for (FeedServiceLevelAgreement agreement : feedAgreements) {
Set<? extends Feed> slaFeeds = agreement.getFeeds();
String title = agreement.getName();
if (slaFeeds != null) {
Assert.assertEquals(title, feedSlaTitle);
Assert.assertEquals(slaFeeds.size(), numberOfFeeds);
for (Feed feed : slaFeeds) {
Assert.assertTrue(feedIds.contains(feed.getId()));
}
} else {
Assert.assertEquals(title, nonFeedSlaTitle);
nonFeedSlaCount++;
}
}
Assert.assertEquals(nonFeedSlaCount, 0);
//find by Feed
for (Feed.ID feedId : feedIds) {
List<FeedServiceLevelAgreement> feedServiceLevelAgreements = jcrFeedSlaProvider.findFeedServiceLevelAgreements(feedId);
Assert.assertTrue(feedServiceLevelAgreements != null && !feedServiceLevelAgreements.isEmpty());
}
return feedSla.getId();
});
ExtensibleEntity entity = metadata.read(new AdminCredentials(), () -> {
ExtensibleEntity e = entityProvider.getEntity(feedSlaEntityId);
Set<Node> feeds = (Set<Node>) e.getPropertyAsSet(JcrFeedServiceLevelAgreementRelationship.FEEDS, Node.class);
Assert.assertEquals(feeds.size(), numberOfFeeds);
for (Node feed : feeds) {
try {
Assert.assertTrue(feedIds.contains(feedProvider.resolveFeed(feed.getIdentifier())));
} catch (RepositoryException e1) {
e1.printStackTrace();
}
}
return e;
});
//now remove the feed relationships
boolean removedFeedRelationships = metadata.commit(new AdminCredentials(), () -> {
ServiceLevelAgreement sla = slaProvider.getAgreement(slaId);
return feedSlaProvider.removeFeedRelationships(slaId);
});
//query for the feeds related to this SLA and verify there are none
metadata.read(new AdminCredentials(), () -> {
FeedServiceLevelAgreement feedServiceLevelAgreement = feedSlaProvider.findAgreement(slaId);
Assert.assertTrue(feedServiceLevelAgreement.getFeeds() == null || (feedServiceLevelAgreement.getFeeds().isEmpty()));
return null;
});
}
public ExtensibleEntity.ID createFeedSLAEntity(Set<Feed.ID> feedIdList, String title) {
return metadata.commit(new AdminCredentials(), () -> {
ServiceLevelAgreement sla = slaProvider.builder().name(title).description(title + " DESC").build();
ExtensibleEntity entity = feedSlaProvider.relate(sla, feedIdList);
return entity.getId();
});
}
public ServiceLevelAgreement.ID createGenericSla(String title) {
return metadata.commit(new AdminCredentials(), () -> {
ServiceLevelAgreement sla = slaProvider.builder().name(title).description(title + " DESC").build();
return sla.getId();
});
}
}