package com.thinkbiganalytics.metadata.rest.client; /*- * #%L * thinkbig-metadata-rest-client-spring * %% * 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.op.FeedDependencyDeltaResults; import com.thinkbiganalytics.metadata.api.sla.FeedExecutedSinceFeed; import com.thinkbiganalytics.metadata.rest.model.data.Datasource; import com.thinkbiganalytics.metadata.rest.model.data.DirectoryDatasource; import com.thinkbiganalytics.metadata.rest.model.data.HiveTableDatasource; import com.thinkbiganalytics.metadata.rest.model.data.HiveTablePartition; import com.thinkbiganalytics.metadata.rest.model.extension.ExtensibleTypeDescriptor; import com.thinkbiganalytics.metadata.rest.model.feed.Feed; import com.thinkbiganalytics.metadata.rest.model.op.DataOperation; import com.thinkbiganalytics.metadata.rest.model.op.DataOperation.State; import com.thinkbiganalytics.metadata.rest.model.op.Dataset; import com.thinkbiganalytics.metadata.rest.model.op.Dataset.ChangeType; import com.thinkbiganalytics.metadata.rest.model.op.Dataset.ContentType; import com.thinkbiganalytics.metadata.rest.model.op.HiveTablePartitions; import com.thinkbiganalytics.metadata.rest.model.sla.ServiceLevelAssessment; import org.joda.time.DateTime; import org.testng.annotations.BeforeClass; import java.net.URI; import java.text.ParseException; import java.util.Arrays; import java.util.List; import java.util.Properties; import static org.assertj.core.api.Assertions.assertThat; //@Ignore // Requires a running metadata server public class MetadataClientTest { private MetadataClient client; @BeforeClass public void connect() { client = new MetadataClient(URI.create("http://localhost:8420/api/v1/metadata/")); } // @Test public void testGetExtensibleTypes() { List<ExtensibleTypeDescriptor> types = client.getExtensibleTypes(); assertThat(types).extracting("name") .contains("feed", "datasource"); assertThat(types.get(0).getFields()).extracting("name") .isNotEmpty(); } // @Test public void testGetExtensibleTypeByName() { ExtensibleTypeDescriptor type = client.getExtensibleType("feed"); assertThat(type).isNotNull(); assertThat(type.getName()).isEqualTo("feed"); } // @Test(dependsOnMethods="testGetExtensibleTypeByName") public void testGetExtensibleTypeById() { ExtensibleTypeDescriptor feed = client.getExtensibleType("feed"); ExtensibleTypeDescriptor type = client.getExtensibleType(feed.getId()); assertThat(type).isNotNull(); assertThat(type.getName()).isEqualTo("feed"); } // @Test() public void testCreateFeedSubtype() { ExtensibleTypeDescriptor subtype = new ExtensibleTypeDescriptor("testFeed", "feed"); } // @Test public void testBuildFeed() throws ParseException { Feed feed = buildFeed("category", "feed1").post(); assertThat(feed).isNotNull(); feed = client.getFeed(feed.getId()); assertThat(feed).isNotNull(); } // @Test public void testGetFeeds() throws ParseException { List<Feed> feeds = client.getFeeds(); assertThat(feeds).isNotNull().isNotEmpty(); } // @Test public void testMergeFeedProperties() throws ParseException { Feed feed = buildFeed("category", "feed1").post(); assertThat(feed).isNotNull(); assertThat(feed.getProperties()).isNotNull().hasSize(1).containsEntry("key1", "value1"); Properties props = new Properties(); props.setProperty("testKey", "testValue"); Properties result = client.mergeFeedProperties(feed.getId(), props); assertThat(result).isNotNull().hasSize(2).containsEntry("testKey", "testValue"); } // @Test public void testUpdateFeed() throws ParseException { Feed feed = buildFeed("category", "feed1").post(); assertThat(feed.getDescription()).isEqualTo("feed1 feed"); assertThat(feed.getState()).isEqualTo(Feed.State.ENABLED); // assertThat(feed.isInitialized()).isFalse(); feed.setDescription("Description changed"); feed.setState(Feed.State.DISABLED); // feed.setInitialized(true); Feed result = client.updateFeed(feed); assertThat(result).isNotNull(); assertThat(result.getDescription()).isEqualTo("Description changed"); assertThat(result.getState()).isEqualTo(Feed.State.DISABLED); // assertThat(feed.isInitialized()).isTrue(); } // @Test public void testAddFeedSource() throws ParseException { Feed feed = buildFeed("category", "feed1").post(); HiveTableDatasource ds = buildHiveTableDatasource("test-table").post(); Feed result = client.addSource(feed.getId(), ds.getId()); assertThat(result).isNotNull(); } // @Test public void testAddFeedDestination() throws ParseException { Feed feed = buildFeed("category", "feed1").post(); HiveTableDatasource ds = buildHiveTableDatasource("test-table").post(); Feed result = client.addDestination(feed.getId(), ds.getId()); assertThat(result).isNotNull(); } // @Test public void testBuildHiveTableDatasource() { HiveTableDatasource ds = buildHiveTableDatasource("test-table").post(); assertThat(ds).isNotNull(); } // @Test public void testBuildDirectoryDatasource() { DirectoryDatasource ds = buildDirectoryDatasource("test-dir").post(); assertThat(ds).isNotNull(); } // @Test public void testListDatasources() { buildDirectoryDatasource("ds1").post(); buildHiveTableDatasource("ds2").post(); buildDirectoryDatasource("ds3").post(); List<Datasource> list = client.getDatasources(); assertThat(list) .isNotNull() .isNotEmpty(); } // @Test public void testBeginOperation() throws ParseException { Feed feed = buildFeed("category", "feed1").post(); HiveTableDatasource ds = buildHiveTableDatasource("test-table").post(); feed = client.addDestination(feed.getId(), ds.getId()); String destId = feed.getDestinations().iterator().next().getId(); DataOperation op = client.beginOperation(destId, ""); assertThat(op).isNotNull(); } // @Test public void testCompleteOperation() throws ParseException { Feed feedA = buildFeed("category", "feedA").post(); HiveTableDatasource dsA = buildHiveTableDatasource("test-table").post(); feedA = client.addDestination(feedA.getId(), dsA.getId()); Feed feedB = buildFeed("category", "feedB", "category", "feedA").post(); feedB = client.addSource(feedB.getId(), dsA.getId()); String destA = feedA.getDestinations().iterator().next().getId(); DataOperation op = client.beginOperation(destA, ""); op.setState(State.SUCCESS); HiveTablePartitions changeSet = new HiveTablePartitions(); changeSet.setPartitions(Arrays.asList(new HiveTablePartition("month", null, "Jan", "Feb"), new HiveTablePartition("year", null, "2015", "2016"))); Dataset dataset = new Dataset(new DateTime(), dsA, ChangeType.UPDATE, ContentType.PARTITIONS, changeSet); op.setDataset(dataset); op = client.updateDataOperation(op); assertThat(op).isNotNull(); } // @Test public void testCheckPrecondition() throws ParseException { Feed feedA = buildFeed("category", "feedA").post(); Feed feedB = buildFeed("category", "feedB", "category", "feedA").post(); HiveTableDatasource dsA = buildHiveTableDatasource("test-table").post(); feedA = client.addDestination(feedA.getId(), dsA.getId()); String destIdA = feedA.getDestinations().iterator().next().getId(); DataOperation op = client.beginOperation(destIdA, ""); op.setState(State.SUCCESS); op.setDataset(new Dataset(new DateTime(), dsA, ChangeType.UPDATE, ContentType.PARTITIONS)); op = client.updateDataOperation(op); ServiceLevelAssessment assmt = client.assessPrecondition(feedB.getId()); assertThat(assmt).isNotNull(); } // @Test public void testGetFeedDependencyDeltas() { FeedDependencyDeltaResults props = client.getFeedDependencyDeltas("90056286-a3b0-493c-89a4-91cb1e7529b6"); assertThat(props).isNotNull(); } private FeedBuilder buildFeed(String category, String name) throws ParseException { return client.buildFeed(category, name) .description(name + " feed") .owner("owner") .displayName(name) .property("key1", "value1"); // .preconditionMetric(FeedExecutedSinceScheduleMetric.named(name, "0 0 6 * * ? *")); } private FeedBuilder buildFeed(String category, String name, String dependentCategory, String dependent) throws ParseException { return client.buildFeed(category, name) .description(name + " feed") .owner("owner") .displayName(name) .property("key1", "value1") .preconditionMetric(new FeedExecutedSinceFeed(dependentCategory, dependent, category, name)); } private DirectoryDatasourceBuilder buildDirectoryDatasource(String name) { return client.buildDirectoryDatasource(name) .description(name + " datasource") .compressed(true) .owner("owner") .path("/tmp/test") .globPattern("*.txt"); } private HiveTableDatasourceBuilder buildHiveTableDatasource(String name) { return client.buildHiveTableDatasource(name) .description(name + " datasource") .encrypted(true) .owner("owner") .database("testdb") .tableName("test_table") .field("key", "INT") .field("value", "VARCHAR") .partition("month", null, "jan", "feb", "mar") .partition("year", null, "2016"); } }