package com.thinkbiganalytics.nifi.v2.core.metadata; /*- * #%L * thinkbig-nifi-core-service * %% * 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.rest.client.MetadataClient; import com.thinkbiganalytics.metadata.rest.model.data.Datasource; import com.thinkbiganalytics.metadata.rest.model.data.DatasourceCriteria; import com.thinkbiganalytics.metadata.rest.model.data.DirectoryDatasource; import com.thinkbiganalytics.metadata.rest.model.data.HiveTableDatasource; import com.thinkbiganalytics.metadata.rest.model.feed.Feed; import com.thinkbiganalytics.metadata.rest.model.feed.FeedDestination; 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.FileList; import com.thinkbiganalytics.metadata.rest.model.op.HiveTablePartitions; import com.thinkbiganalytics.metadata.sla.api.Metric; import com.thinkbiganalytics.nifi.core.api.metadata.MetadataProvider; import org.joda.time.DateTime; import java.net.URI; import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.Properties; import javax.annotation.Nonnull; public class MetadataClientProvider implements MetadataProvider { private MetadataClient client; /** * constructor creates a MetaDataClientProvider with the default URI constant */ public MetadataClientProvider() { this(URI.create("http://localhost:8077/api/v1/metadata")); } /** * constructor creates a MetaDataClientProvider with the URI provided * * @param baseUri the REST endpoint of the Metadata store */ public MetadataClientProvider(URI baseUri) { this(new MetadataClient(baseUri)); } public MetadataClientProvider(URI baseUri, String username, String password) { this(new MetadataClient(baseUri, username, password)); } /** * constructor creates a MetadataClientProvider with the required {@link MetadataClient} * * @param client the MetadataClient will be used to connect with the Metadata store */ public MetadataClientProvider(MetadataClient client) { super(); this.client = client; } @Override public String getFeedId(String category, String feedName) { List<Feed> feeds = this.client.getFeeds(this.client.feedCriteria().category(category).name(feedName)); if (feeds.isEmpty()) { return null; } else { return feeds.get(0).getId(); } } @Override public FeedDependencyDeltaResults getFeedDependentResultDeltas(String feedId) { return this.client.getFeedDependencyDeltas(feedId); } /* (non-Javadoc) * @see com.thinkbiganalytics.controller.metadata.MetadataProvider#ensureFeed(java.lang.String, java.lang.String) */ @Override public Feed ensureFeed(String categoryName, String feedName, String descr) { return this.client .buildFeed(categoryName, feedName) .description(descr) .post(); } /* (non-Javadoc) * @see com.thinkbiganalytics.controller.metadata.MetadataProvider#getDatasourceByName(java.lang.String) */ @Override public Datasource getDatasourceByName(String dsName) { DatasourceCriteria criteria = this.client.datasourceCriteria().name(dsName); List<Datasource> list = this.client.getDatasources(criteria); if (list.isEmpty()) { return null; } else { return list.get(0); } } /* (non-Javadoc) * @see com.thinkbiganalytics.controller.metadata.MetadataProvider#ensureFeedSource(java.lang.String, java.lang.String) */ @Override public Feed ensureFeedSource(String feedId, String datasourceId) { return this.client.addSource(feedId, datasourceId); } /* (non-Javadoc) * @see com.thinkbiganalytics.controller.metadata.MetadataProvider#ensureFeedDestination(java.lang.String, java.lang.String) */ @Override public Feed ensureFeedDestination(String feedId, String datasourceId) { return this.client.addDestination(feedId, datasourceId); } @Override public Properties updateFeedProperties(String feedId, Properties props) { return this.client.mergeFeedProperties(feedId, props); } @Override public Feed ensurePrecondition(String feedId, Metric... metrics) { return this.client.setPrecondition(feedId, metrics); } /* (non-Javadoc) * @see com.thinkbiganalytics.controller.metadata.MetadataProvider#ensureDirectoryDatasource(java.lang.String, java.lang.String, java.nio.file.Path) */ @Override public DirectoryDatasource ensureDirectoryDatasource(String datasetName, String descr, Path path) { return this.client.buildDirectoryDatasource(datasetName) .description(descr) .path(path.toString()) .post(); } /* (non-Javadoc) * @see com.thinkbiganalytics.controller.metadata.MetadataProvider#ensureHiveTableDatasource(java.lang.String, java.lang.String, java.lang.String, java.lang.String) */ @Override public HiveTableDatasource ensureHiveTableDatasource(String dsName, String descr, String databaseName, String tableName) { return this.client.buildHiveTableDatasource(dsName) .description(descr) .database(databaseName) .tableName(tableName) .post(); } @Override public Dataset createDataset(DirectoryDatasource dds, Path... paths) { return createDataset(dds, new ArrayList<>(Arrays.asList(paths))); } /* (non-Javadoc) * @see com.thinkbiganalytics.controller.metadata.MetadataProvider#createDatasourceSet(com.thinkbiganalytics.metadata.rest.model.data.DirectoryDatasource, java.util.ArrayList) */ @Override public Dataset createDataset(DirectoryDatasource dds, ArrayList<Path> paths) { FileList files = new FileList(paths); return new Dataset(dds, ChangeType.UPDATE, ContentType.FILES, files); } /* (non-Javadoc) * @see com.thinkbiganalytics.controller.metadata.MetadataProvider#createChangeSet(com.thinkbiganalytics.metadata.rest.model.data.HiveTableDatasource, int) */ @Override public Dataset createDataset(HiveTableDatasource hds, HiveTablePartitions partitions) { return new Dataset(hds, ChangeType.UPDATE, ContentType.PARTITIONS, partitions); } /* (non-Javadoc) * @see com.thinkbiganalytics.controller.metadata.MetadataProvider#beginOperation(com.thinkbiganalytics.metadata.rest.model.feed.FeedDestination, org.joda.time.DateTime) */ @Override public DataOperation beginOperation(FeedDestination feedDestination, DateTime opStart) { return this.client.beginOperation(feedDestination.getId(), ""); } /* (non-Javadoc) * @see com.thinkbiganalytics.controller.metadata.MetadataProvider#updateOperation(java.lang.String, java.lang.String, com.thinkbiganalytics.metadata.rest.model.data.Datasource) */ @Override public DataOperation completeOperation(String id, String status, Dataset dataset) { DataOperation op = this.client.getDataOperation(id); op.setStatus(status); op.setDataset(dataset); op.setState(State.SUCCESS); return this.client.updateDataOperation(op); } @Override public DataOperation completeOperation(String id, String string, State state) { DataOperation op = this.client.getDataOperation(id); op.setState(state); return this.client.updateDataOperation(op); } @Override public Properties getFeedProperties(@Nonnull String id) { return client.getFeedProperties(id); } @Override public Properties mergeFeedProperties(@Nonnull String id, @Nonnull Properties props) { return client.mergeFeedProperties(id, props); } @Override public Optional<Datasource> getDatasource(@Nonnull final String id) { return client.getDatasource(id); } }