http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/resource/ExtensionInstanceList.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/resource/ExtensionInstanceList.java b/common-types/src/main/java/org/apache/falcon/resource/ExtensionInstanceList.java new file mode 100644 index 0000000..a7ca4e4 --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/resource/ExtensionInstanceList.java @@ -0,0 +1,96 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.falcon.resource; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Instance list of an extension job used for marshalling / unmarshalling with REST calls. + */ +//SUSPEND CHECKSTYLE CHECK VisibilityModifierCheck +@XmlRootElement [email protected]({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) +public class ExtensionInstanceList { + @XmlElement + public int numEntities; + + @XmlElementWrapper(name = "entitiesSummary") + public List<EntitySummary> entitySummary; + + public ExtensionInstanceList() { + numEntities = 0; + entitySummary = null; + } + + public ExtensionInstanceList(int numEntities) { + this.numEntities = numEntities; + entitySummary = new ArrayList<>(); + } + + public ExtensionInstanceList(int numEntities, List<EntitySummary> entitySummary) { + this.numEntities = numEntities; + this.entitySummary = entitySummary; + } + + public void addEntitySummary(EntitySummary summary) { + entitySummary.add(summary); + } + + public String toString() { + StringBuilder buffer = new StringBuilder(); + buffer.append(numEntities + "\n\n"); + for (EntitySummary summary : entitySummary) { + buffer.append(summary.toString()); + } + return buffer.toString(); + } + + /** + * Summary of an entity (including entity properties and instances. + */ + public static class EntitySummary { + @XmlElement + public EntityList.EntityElement entityProfile; + + @XmlElement + public InstancesResult.Instance[] instances; + + public EntitySummary() { + entityProfile = null; + instances = null; + } + + public EntitySummary(EntityList.EntityElement entityProfile, InstancesResult.Instance[] instances) { + this.entityProfile = entityProfile; + this.instances = instances; + } + + public String toString() { + StringBuilder buffer = new StringBuilder(); + buffer.append(entityProfile.toString() + "\n"); + buffer.append(Arrays.toString(instances) + "\n"); + return buffer.toString(); + } + } +}
http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/resource/ExtensionJobList.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/resource/ExtensionJobList.java b/common-types/src/main/java/org/apache/falcon/resource/ExtensionJobList.java new file mode 100644 index 0000000..ca031b5 --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/resource/ExtensionJobList.java @@ -0,0 +1,98 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.falcon.resource; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.ArrayList; +import java.util.List; + +/** + * Extension job list used for marshalling / unmarshalling with REST calls. + */ +//SUSPEND CHECKSTYLE CHECK VisibilityModifierCheck +@XmlRootElement [email protected]({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) +public class ExtensionJobList { + + @XmlElement + public int numJobs; + + @XmlElementWrapper(name = "jobs") + public List<JobElement> job; + + public ExtensionJobList() { + numJobs = 0; + job = null; + } + + public ExtensionJobList(int numJobs) { + this.numJobs = numJobs; + job = new ArrayList<JobElement>(); + } + + public ExtensionJobList(int numJobs, List<JobElement> elements) { + this.numJobs = numJobs; + this.job = elements; + } + + public void addJob(JobElement element) { + job.add(element); + } + + @Override + public String toString() { + StringBuilder buffer = new StringBuilder(); + buffer.append(numJobs + "\n\n"); + for (JobElement element : job) { + buffer.append(element.toString()); + } + return buffer.toString(); + } + + /** + * Element for a job. + */ + public static class JobElement { + @XmlElement + public String jobName; + + @XmlElement + public EntityList jobEntities; + + public JobElement() { + jobName = null; + jobEntities = null; + } + + public JobElement(String name, EntityList entities) { + jobName = name; + jobEntities = entities; + } + + @Override + public String toString() { + StringBuilder buffer = new StringBuilder(); + buffer.append("Job: " + jobName + ", #. entities: "); + buffer.append(jobEntities.toString() + "\n"); + return buffer.toString(); + } + } +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/resource/FeedInstanceResult.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/resource/FeedInstanceResult.java b/common-types/src/main/java/org/apache/falcon/resource/FeedInstanceResult.java new file mode 100644 index 0000000..75f0b9a --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/resource/FeedInstanceResult.java @@ -0,0 +1,155 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.falcon.resource; + +import org.apache.commons.io.FileUtils; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * Pojo for JAXB marshalling / unmarshalling. + */ +//SUSPEND CHECKSTYLE CHECK VisibilityModifierCheck +@XmlRootElement [email protected]({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) +public class FeedInstanceResult extends APIResult { + + @XmlElement + private Instance[] instances; + + private FeedInstanceResult() { // for jaxb + super(); + } + + public FeedInstanceResult(String message, Instance[] instances) { + this(Status.SUCCEEDED, message, instances); + } + + public FeedInstanceResult(Status status, String message, + Instance[] inInstances) { + super(status, message); + this.instances = inInstances; + } + + public FeedInstanceResult(Status status, String message) { + super(status, message); + } + + public Instance[] getInstances() { + return instances; + } + + public void setInstances(Instance[] instances) { + this.instances = instances; + } + + @Override + public Object[] getCollection() { + return getInstances(); + } + + @Override + public void setCollection(Object[] items) { + if (items == null) { + setInstances(new Instance[0]); + } else { + Instance[] newInstances = new Instance[items.length]; + for (int index = 0; index < items.length; index++) { + newInstances[index] = (Instance)items[index]; + } + setInstances(newInstances); + } + } + + /** + * A single instance object inside instance result. + */ + @XmlRootElement(name = "instance") + public static class Instance { + @XmlElement + public String cluster; + + @XmlElement + public String instance; + + @XmlElement + public String status; + + @XmlElement + public String uri; + + @XmlElement + public long creationTime; + + @XmlElement + public long size; + + @XmlElement + public String sizeH; + + public Instance() { + } + + public Instance(String cluster, String instance, String status) { + this.cluster = cluster; + this.instance = instance; + this.status = status; + } + + public String getInstance() { + return instance; + } + + public String getStatus() { + return status; + } + + public String getUri() { + return uri; + } + + public String getCluster() { + return cluster; + } + + public long getCreationTime() { + return creationTime; + } + + public Long getSize() { + return size; + } + + public String getSizeH(){ + return FileUtils.byteCountToDisplaySize(size); + } + + @Override + public String toString() { + return "{instance:" + + this.instance + + ", status:" + + this.status + + (this.uri == null ? "" : ", uri: " + this.uri) + + (this.cluster == null ? "" : ", cluster:" + this.cluster) + "}"; + } + } +} +//RESUME CHECKSTYLE CHECK VisibilityModifierCheck http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/resource/FeedLookupResult.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/resource/FeedLookupResult.java b/common-types/src/main/java/org/apache/falcon/resource/FeedLookupResult.java new file mode 100644 index 0000000..f8d58ae --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/resource/FeedLookupResult.java @@ -0,0 +1,172 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.falcon.resource; + +import org.apache.commons.lang3.StringUtils; +import org.apache.falcon.entity.v0.feed.LocationType; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * Entity list used for marshalling / unmarshalling with REST calls. + */ +@XmlRootElement(name = "feeds") +@XmlAccessorType(XmlAccessType.FIELD) [email protected]({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) +public class FeedLookupResult extends APIResult { + + @XmlElement(name = "elements") + private FeedProperties[] elements; + + //For JAXB + private FeedLookupResult() { + super(); + } + + public FeedLookupResult(Status status, String message) { + super(status, message); + } + + public FeedProperties[] getElements() { + return elements; + } + + public void setElements(FeedProperties[] elements) { + this.elements = elements; + } + + + @Override + public Object[] getCollection() { + return getElements(); + } + + @Override + public void setCollection(Object[] items) { + if (items == null) { + setElements(new FeedProperties[0]); + } else { + FeedProperties[] newInstances = new FeedProperties[items.length]; + for (int index = 0; index < items.length; index++) { + newInstances[index] = (FeedProperties)items[index]; + } + setElements(newInstances); + } + } + + @Override + public String toString() { + StringBuilder buffer = new StringBuilder(); + if (elements != null) { + for (FeedProperties element : elements) { + buffer.append(element.toString()); + buffer.append("\n"); + } + } + return buffer.toString(); + } + + /** + * A single instance in the result. + */ + @XmlRootElement(name = "feed") + @XmlAccessorType(XmlAccessType.FIELD) + public static class FeedProperties { + @XmlElement + private String feedName; + + @XmlElement + private LocationType locationType; + + @XmlElement + private String clusterName; + + public FeedProperties(String feedName, LocationType locationType, String clusterName){ + this.clusterName = clusterName; + this.locationType = locationType; + this.feedName = feedName; + } + + //for JAXB + private FeedProperties(){} + + public void setFeedName(String feedName) { + this.feedName = feedName; + } + + public void setLocationType(LocationType locationType) { + this.locationType = locationType; + } + + public void setClusterName(String clusterName) { + this.clusterName = clusterName; + } + + public String getFeedName() { + return this.feedName; + } + + public LocationType getLocationType() { + return this.locationType; + } + + public String getClusterName() { + return this.clusterName; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + FeedProperties that = (FeedProperties) o; + if (!StringUtils.equals(clusterName, that.clusterName)) { + return false; + } + if (locationType != that.locationType) { + return false; + } + if (!StringUtils.equals(feedName, that.feedName)) { + return false; + } + return true; + } + + @Override + public int hashCode() { + int result = feedName.hashCode(); + result = 31 * result + (locationType != null ? locationType.hashCode() : 0); + result = 31 * result + (clusterName != null ? clusterName.hashCode() : 0); + return result; + } + + @Override + public String toString() { + return feedName + " (CLUSTER:" + clusterName + ") (LocationType:" + locationType.name() + ")"; + } + + } + +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/resource/InstanceDependencyResult.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/resource/InstanceDependencyResult.java b/common-types/src/main/java/org/apache/falcon/resource/InstanceDependencyResult.java new file mode 100644 index 0000000..0751f12 --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/resource/InstanceDependencyResult.java @@ -0,0 +1,86 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.falcon.resource; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * Entity list used for marshalling / unmarshalling with REST calls. + */ +@XmlRootElement(name = "dependents") +@XmlAccessorType(XmlAccessType.FIELD) [email protected]({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) +public class InstanceDependencyResult extends APIResult { + + @XmlElement(name = "dependencies") + private SchedulableEntityInstance[] dependencies; + + //For JAXB + private InstanceDependencyResult() { + super(); + } + + public InstanceDependencyResult(Status status, String message) { + super(status, message); + } + + public SchedulableEntityInstance[] getDependencies() { + return dependencies; + } + + public void setDependencies(SchedulableEntityInstance[] dependencies) { + this.dependencies = dependencies; + } + + + @Override + public Object[] getCollection() { + return getDependencies(); + } + + @Override + public void setCollection(Object[] items) { + if (items == null) { + setDependencies(new SchedulableEntityInstance[0]); + } else { + SchedulableEntityInstance[] newInstances = new SchedulableEntityInstance[items.length]; + for (int index = 0; index < items.length; index++) { + newInstances[index] = (SchedulableEntityInstance)items[index]; + } + setDependencies(newInstances); + } + } + + @Override + public String toString() { + StringBuilder buffer = new StringBuilder(); + if (dependencies != null) { + for (SchedulableEntityInstance element : dependencies) { + buffer.append(element.toString()); + buffer.append("\n"); + } + } + return buffer.toString(); + } + + +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/resource/InstancesResult.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/resource/InstancesResult.java b/common-types/src/main/java/org/apache/falcon/resource/InstancesResult.java new file mode 100644 index 0000000..645050c --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/resource/InstancesResult.java @@ -0,0 +1,261 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.falcon.resource; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.Date; + +/** + * Pojo for JAXB marshalling / unmarshalling. + */ +//SUSPEND CHECKSTYLE CHECK VisibilityModifierCheck +@XmlRootElement [email protected]({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) +public class InstancesResult extends APIResult { + + /** + * Workflow status as being set in result object. + */ + public static enum WorkflowStatus { + WAITING, RUNNING, SUSPENDED, KILLED, FAILED, SUCCEEDED, ERROR, SKIPPED, UNDEFINED, READY, KILLED_OR_IGNORED, + TIMEDOUT + } + + /** + * RestAPI supports filterBy these fields of instance. + */ + public static enum InstanceFilterFields { + STATUS, CLUSTER, SOURCECLUSTER, STARTEDAFTER + } + + @XmlElement + private Instance[] instances; + + private InstancesResult() { // for jaxb + super(); + } + + public InstancesResult(Status status, String message) { + super(status, message); + } + + + public Instance[] getInstances() { + return instances; + } + + public void setInstances(Instance[] instances) { + this.instances = instances; + } + + @Override + public Object[] getCollection() { + return getInstances(); + } + + @Override + public void setCollection(Object[] items) { + if (items == null) { + setInstances(new Instance[0]); + } else { + Instance[] newInstances = new Instance[items.length]; + for (int index = 0; index < items.length; index++) { + newInstances[index] = (Instance)items[index]; + } + setInstances(newInstances); + } + } + + /** + * A single instance object inside instance result. + */ + @XmlRootElement(name = "instance") + public static class Instance { + @XmlElement + public String instance; + + @XmlElement + public WorkflowStatus status; + + @XmlElement + public String logFile; + + @XmlElement + public String cluster; + + @XmlElement + public String sourceCluster; + + @XmlElement + public Date startTime; + + @XmlElement + public Date endTime; + + @XmlElement + public int runId; + + @XmlElement + public String details; + + @XmlElement + public InstanceAction[] actions; + + @XmlElement(name="wfParams") + public KeyValuePair[] wfParams; + + public Instance() { + } + + public Instance(String cluster, String instance, WorkflowStatus status) { + this.cluster = cluster; + this.instance = instance; + this.status = status; + } + + public String getInstance() { + return instance; + } + + public WorkflowStatus getStatus() { + return status; + } + + public String getLogFile() { + return logFile; + } + + public String getCluster() { + return cluster; + } + + public String getSourceCluster() { + return sourceCluster; + } + + public Date getStartTime() { + return startTime; + } + + public Date getEndTime() { + return endTime; + } + + public int getRunId() { + return runId; + } + + public InstanceAction[] getActions() { + return actions; + } + + public String getDetails() { + return details; + } + + public KeyValuePair[] getWfParams() { return wfParams; } + + @Override + public String toString() { + return "{instance:" + + this.instance + + ", status:" + + this.status + + (this.logFile == null ? "" : ", log:" + this.logFile) + + (this.sourceCluster == null ? "" : ", source-cluster:" + + this.sourceCluster) + + (this.cluster == null ? "" : ", cluster:" + + this.cluster) + "}\n"; + } + } + + /** + * Instance action inside an instance object. + */ + @XmlRootElement(name = "actions") + public static class InstanceAction { + @XmlElement + public String action; + @XmlElement + public String status; + @XmlElement + public String logFile; + + public InstanceAction() { + } + + public InstanceAction(String action, String status, String logFile) { + this.action = action; + this.status = status; + this.logFile = logFile; + } + + public String getAction() { + return action; + } + + public String getStatus() { + return status; + } + + public String getLogFile() { + return logFile; + } + + @Override + public String toString() { + return "{action:" + this.action + ", status:" + this.status + + (this.logFile == null ? "" : ", log:" + this.logFile) + + "}"; + } + } + + /** + * POJO for key value parameters. + */ + @XmlRootElement(name = "params") + public static class KeyValuePair { + @XmlElement + public String key; + @XmlElement + public String value; + + public KeyValuePair(String key, String value) { + this.key = key; + this.value = value; + } + + public KeyValuePair() { } + + public String getKey() { + return key; + } + + public String getValue() { + return value; + } + + @Override + public String toString() { + return "{key:" + this.key + ", value:" + this.value + "}"; + } + } +} +//RESUME CHECKSTYLE CHECK VisibilityModifierCheck http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/resource/InstancesSummaryResult.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/resource/InstancesSummaryResult.java b/common-types/src/main/java/org/apache/falcon/resource/InstancesSummaryResult.java new file mode 100644 index 0000000..aa0db99 --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/resource/InstancesSummaryResult.java @@ -0,0 +1,114 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.falcon.resource; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.Map; + +/** + * Pojo for JAXB marshalling / unmarshalling. + */ + +//SUSPEND CHECKSTYLE CHECK VisibilityModifierCheck +@XmlRootElement [email protected]({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) +public class InstancesSummaryResult extends APIResult { + + /** + * RestAPI supports filterBy these fields of instanceSummary. + */ + public static enum InstanceSummaryFilterFields { + STATUS, CLUSTER + } + + @XmlElement + private InstanceSummary[] instancesSummary; + + private InstancesSummaryResult() { // for jaxb + super(); + } + + public InstancesSummaryResult(Status status, String message) { + super(status, message); + } + + public InstanceSummary[] getInstancesSummary() { + return instancesSummary; + } + + public void setInstancesSummary(InstanceSummary[] instancesSummary) { + this.instancesSummary = instancesSummary; + } + + @Override + public Object[] getCollection() { + return getInstancesSummary(); + } + + @Override + public void setCollection(Object[] items) { + if (items == null) { + setInstancesSummary(new InstanceSummary[0]); + } else { + InstanceSummary[] newInstances = new InstanceSummary[items.length]; + for (int index = 0; index < items.length; index++) { + newInstances[index] = (InstanceSummary)items[index]; + } + setInstancesSummary(newInstances); + } + } + + /** + * A single instance object inside instance result. + */ + @XmlRootElement(name = "instance-summary") + public static class InstanceSummary { + + @XmlElement + public String cluster; + @XmlElementWrapper(name="map") + public Map<String, Long> summaryMap; + + public InstanceSummary() { + } + + public InstanceSummary(String cluster, Map<String, Long> summaryMap) { + this.cluster = cluster; + this.summaryMap = summaryMap; + } + + public Map<String, Long> getSummaryMap() { + return summaryMap; + } + + public String getCluster() { + return cluster; + } + + @Override + public String toString() { + return "cluster: " + (this.cluster == null ? "" : this.cluster) + + "summaryMap: " + summaryMap.toString(); + } + } + +} +//RESUME CHECKSTYLE CHECK VisibilityModifierCheck http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/resource/LineageGraphResult.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/resource/LineageGraphResult.java b/common-types/src/main/java/org/apache/falcon/resource/LineageGraphResult.java new file mode 100644 index 0000000..0e10e38 --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/resource/LineageGraphResult.java @@ -0,0 +1,191 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.falcon.resource; + +import org.apache.commons.lang3.StringUtils; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * LineageGraphResult is the output returned by all the apis returning a DAG. + */ +@XmlRootElement(name = "result") +@XmlAccessorType (XmlAccessType.FIELD) [email protected]({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) +public class LineageGraphResult { + + private String[] vertices; + + @XmlElement(name="edges") + private Edge[] edges; + + private static final JAXBContext JAXB_CONTEXT; + + static { + try { + JAXB_CONTEXT = JAXBContext.newInstance(LineageGraphResult.class); + } catch (JAXBException e) { + throw new RuntimeException(e); + } + } + + public LineageGraphResult() { + // default constructor for JAXB + } + + /** + * A class to represent an edge in a DAG. + */ + @XmlRootElement(name = "edge") + @XmlAccessorType(XmlAccessType.FIELD) + public static class Edge { + @XmlElement + private String from; + @XmlElement + private String to; + @XmlElement + private String label; + + public Edge() { + + } + + public Edge(String from, String to, String label) { + this.from = from; + this.to = to; + this.label = label; + } + + public String getFrom() { + return from; + } + + public void setFrom(String from) { + this.from = from; + } + + public String getTo() { + return to; + } + + public void setTo(String to) { + this.to = to; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public String getDotNotation() { + StringBuilder result = new StringBuilder(); + if (StringUtils.isNotBlank(this.from) && StringUtils.isNotBlank(this.to) + && StringUtils.isNotBlank(this.label)) { + result.append("\"" + this.from +"\""); + result.append(" -> "); + result.append("\"" + this.to + "\""); + result.append(" [ label = \"" + this.label + "\" ] \n"); + } + return result.toString(); + } + + @Override + public String toString() { + return getDotNotation(); + } + + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + Edge that = (Edge) o; + if (StringUtils.equals(that.getLabel(), label) && StringUtils.equals(that.getFrom(), from) + && StringUtils.equals(that.getTo(), to)) { + return true; + } + return false; + } + + @Override + public int hashCode() { + int result = from != null ? from.hashCode() : 0; + result = 31 * result + (to != null ? to.hashCode() : 0); + result = 31 * result + (label != null ? label.hashCode() : 0); + return result; + } + + } + + + public String getDotNotation() { + StringBuilder result = new StringBuilder(); + result.append("digraph g{ \n"); + if (this.vertices != null) { + for (String v : this.vertices) { + result.append("\"" + v + "\""); + result.append("\n"); + } + } + + if (this.edges != null) { + for (Edge e : this.edges) { + result.append(e.getDotNotation()); + } + } + result.append("}\n"); + return result.toString(); + } + + public String[] getVertices() { + return vertices; + } + + public void setVertices(String[] vertices) { + this.vertices = vertices; + } + + public Edge[] getEdges() { + return edges; + } + + public void setEdges(Edge[] edges) { + this.edges = edges; + } + + + @Override + public String toString() { + return getDotNotation(); + } + +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/resource/SchedulableEntityInstance.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/resource/SchedulableEntityInstance.java b/common-types/src/main/java/org/apache/falcon/resource/SchedulableEntityInstance.java new file mode 100644 index 0000000..0968734 --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/resource/SchedulableEntityInstance.java @@ -0,0 +1,175 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.falcon.resource; + +import org.apache.commons.lang3.StringUtils; +import org.apache.falcon.entity.v0.EntityType; +import org.apache.falcon.entity.v0.SchemaHelper; + +import java.util.Date; + +/** + * Instance of a Schedulable Entity (Feed/Process). + */ +public class SchedulableEntityInstance implements Comparable<SchedulableEntityInstance> { + + public static final String INPUT = "Input"; + public static final String OUTPUT = "Output"; + + private String entityName; + + private String cluster; + + private Date instanceTime; + + private EntityType entityType; + + private String tags; + + //for JAXB + private SchedulableEntityInstance() { + + } + + public SchedulableEntityInstance(String entityName, String cluster, Date instanceTime, EntityType type) { + this.entityName = entityName; + this.cluster = cluster; + this.entityType = type; + if (instanceTime != null) { + this.instanceTime = new Date(instanceTime.getTime()); + } + } + + public String getTags() { + return tags; + } + + public void setTags(String tags) { + this.tags = tags; + } + + public String getEntityName() { + return entityName; + } + + public void setEntityName(String entityName) { + this.entityName = entityName; + } + + public String getCluster() { + return cluster; + } + + public void setCluster(String cluster) { + this.cluster = cluster; + } + + public EntityType getEntityType() { + return entityType; + } + + public void setEntityType(EntityType entityType) { + this.entityType = entityType; + } + + public Date getInstanceTime() { + return new Date(instanceTime.getTime()); + } + + public void setInstanceTime(Date instanceTime) { + this.instanceTime = new Date(instanceTime.getTime()); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("name: " + entityName + + ", type: " + entityType + + ", cluster: " + cluster + + ", instanceTime: " + SchemaHelper.formatDateUTC(instanceTime)); + sb.append(", tags: " + ((tags != null) ? tags : "")); + return sb.toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + SchedulableEntityInstance that = (SchedulableEntityInstance) o; + + if (instanceTime == null ? that.instanceTime != null : !instanceTime.equals(that.instanceTime)) { + return false; + } + + if (!entityType.equals(that.entityType)) { + return false; + } + + if (!StringUtils.equals(entityName, that.entityName)) { + return false; + } + + if (!StringUtils.equals(cluster, that.cluster)) { + return false; + } + + if (!StringUtils.equals(tags, that.tags)) { + return false; + } + + return true; + } + + @Override + public int hashCode() { + int result = instanceTime.hashCode(); + result = 31 * result + entityName.hashCode(); + result = 31 * result + entityType.hashCode(); + result = 31 * result + cluster.hashCode(); + if (tags != null) { + result = 31 * result + tags.hashCode(); + } + return result; + } + + @Override + public int compareTo(SchedulableEntityInstance o) { + int result = this.cluster.compareTo(o.cluster); + if (result != 0) { + return result; + } + + result = this.entityType.compareTo(o.entityType); + if (result != 0) { + return result; + } + + result = this.entityName.compareToIgnoreCase(o.entityName); + if (result != 0) { + return result; + } + + return this.instanceTime.compareTo(o.instanceTime); + } +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/resource/SchedulableEntityInstanceResult.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/resource/SchedulableEntityInstanceResult.java b/common-types/src/main/java/org/apache/falcon/resource/SchedulableEntityInstanceResult.java new file mode 100644 index 0000000..752c48d --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/resource/SchedulableEntityInstanceResult.java @@ -0,0 +1,86 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.falcon.resource; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.Arrays; + +/** + * Instances list used for marshalling / unmarshalling with REST calls. + */ +@XmlRootElement(name = "instances") +@XmlAccessorType(XmlAccessType.FIELD) [email protected]({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) +public class SchedulableEntityInstanceResult extends APIResult { + + @XmlElement(name = "instances") + private SchedulableEntityInstance[] instances; + + //For JAXB + private SchedulableEntityInstanceResult() { + super(); + } + + public SchedulableEntityInstanceResult(Status status, String message) { + super(status, message); + } + + public SchedulableEntityInstance[] getInstances() { + return instances; + } + + public void setInstances(SchedulableEntityInstance[] instances) { + this.instances = instances; + } + + + @Override + public Object[] getCollection() { + return getInstances(); + } + + @Override + public void setCollection(Object[] items) { + if (items == null) { + setInstances(new SchedulableEntityInstance[0]); + } else { + SchedulableEntityInstance[] newInstances = new SchedulableEntityInstance[items.length]; + for (int index = 0; index < items.length; index++) { + newInstances[index] = (SchedulableEntityInstance)items[index]; + } + setInstances(newInstances); + } + } + + @Override + public String toString() { + StringBuilder buffer = new StringBuilder(); + if (instances != null) { + Arrays.sort(instances); + for (SchedulableEntityInstance element : instances) { + buffer.append(element.toString()); + buffer.append("\n"); + } + } + return buffer.toString(); + } +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/java/org/apache/falcon/resource/TriageResult.java ---------------------------------------------------------------------- diff --git a/common-types/src/main/java/org/apache/falcon/resource/TriageResult.java b/common-types/src/main/java/org/apache/falcon/resource/TriageResult.java new file mode 100644 index 0000000..131e2e1 --- /dev/null +++ b/common-types/src/main/java/org/apache/falcon/resource/TriageResult.java @@ -0,0 +1,87 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +package org.apache.falcon.resource; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * Resut for instance triage. + */ +@XmlRootElement(name = "triage") +@XmlAccessorType(XmlAccessType.FIELD) [email protected]({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) +public class TriageResult extends APIResult { + + @XmlElement(name = "triageGraphs") + private LineageGraphResult[] triageGraphs; + + //For JAXB + private TriageResult() { + super(); + } + + public TriageResult(Status status, String message) { + super(status, message); + } + + + + public LineageGraphResult[] getTriageGraphs() { + return triageGraphs; + } + + public void setTriageGraphs(LineageGraphResult[] triageGraphs) { + this.triageGraphs = triageGraphs; + } + + + @Override + public Object[] getCollection() { + return getTriageGraphs(); + } + + + @Override + public void setCollection(Object[] items) { + if (items == null) { + setTriageGraphs(new LineageGraphResult[0]); + } else { + LineageGraphResult[] graphs = new LineageGraphResult[items.length]; + for (int index = 0; index < items.length; index++) { + graphs[index] = (LineageGraphResult)items[index]; + } + setTriageGraphs(graphs); + } + } + + @Override + public String toString() { + StringBuilder buffer = new StringBuilder(); + if (triageGraphs != null) { + for (LineageGraphResult graph : triageGraphs) { + buffer.append(graph.getDotNotation()); + buffer.append("\n\n"); + } + } + return buffer.toString(); + } +} http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/resources/cluster-0.1.xsd ---------------------------------------------------------------------- diff --git a/common-types/src/main/resources/cluster-0.1.xsd b/common-types/src/main/resources/cluster-0.1.xsd new file mode 100644 index 0000000..03e9f84 --- /dev/null +++ b/common-types/src/main/resources/cluster-0.1.xsd @@ -0,0 +1,214 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + --> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" + targetNamespace="uri:falcon:cluster:0.1" xmlns="uri:falcon:cluster:0.1" + xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"> + <xs:annotation> + <xs:documentation> + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + </xs:documentation> + <xs:appinfo> + <jaxb:schemaBindings> + <jaxb:package name="org.apache.falcon.entity.v0.cluster"/> + </jaxb:schemaBindings> + </xs:appinfo> + </xs:annotation> + <xs:element name="cluster" type="cluster"> + </xs:element> + <xs:complexType name="cluster"> + <xs:annotation> + <xs:documentation>The cluster contains the definition of different + interfaces which are used by Falcon like readonly, write, workflow and messaging. + A cluster is referenced by feeds and processes which are on-boarded + to Falcon by its name. + name: the name of cluster, which must be unique. + colo: the name of the colo to which this cluster belongs to. + </xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element type="KEY_VALUE_PAIR" name="tags" minOccurs="0"> + <xs:annotation> + <xs:documentation> + tags: a process specifies an optional list of comma separated tags, + Key Value Pairs, separated by comma, + which is used for classification of processes. + Example: [email protected], [email protected], department=forecasting + </xs:documentation> + </xs:annotation> + </xs:element> + <xs:element type="interfaces" name="interfaces"/> + <xs:element type="locations" name="locations"/> + <xs:element type="ACL" name="ACL" minOccurs="0" maxOccurs="1"/> + <xs:element type="properties" name="properties" minOccurs="0"/> + </xs:sequence> + <xs:attribute type="IDENTIFIER" name="name" use="required"/> + <xs:attribute type="xs:string" name="description"/> + <xs:attribute type="xs:string" name="colo" use="required"/> + <xs:attribute type="xs:int" name="version" use="optional" default="0"/> + </xs:complexType> + <xs:complexType name="locations"> + <xs:annotation> + <xs:documentation>A list of locations on cluster. + </xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element type="location" name="location" maxOccurs="unbounded" minOccurs="1"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="property"> + <xs:annotation> + <xs:documentation> + A key-value pair, which are propagated to the + workflow engine. + Ideally the Mapred's job queue name (queueName) and + JMS impl class nameof messaging engine (brokerImplClass) + should be defined here. + </xs:documentation> + </xs:annotation> + <xs:attribute type="xs:string" name="name" use="required"/> + <xs:attribute type="xs:string" name="value" use="required"/> + </xs:complexType> + <xs:complexType name="interface"> + <xs:annotation> + <xs:documentation> + An interface specifies the interface type, Falcon uses it to schedule + entities in workflow engine, to save and read data from hadoop and to + publish messages to messaging engine. + endpoint: is the url for each interface; examples: for write it is the + url of hdfs (fs.defaultFS) and + for workflow it is url of workflow engine like oozie. + version: The current runtime version of each interface. + </xs:documentation> + </xs:annotation> + <xs:attribute type="interfacetype" name="type" use="required"/> + <xs:attribute type="xs:string" name="endpoint" use="required"/> + <xs:attribute type="xs:string" name="version" use="required"/> + </xs:complexType> + <xs:complexType name="properties"> + <xs:annotation> + <xs:documentation> + A list of property elements. + </xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element type="property" name="property" maxOccurs="unbounded" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="location"> + <xs:annotation> + <xs:documentation> + Location has the name and the path. + name: is the type of locations which can be + staging, temp and working only. + staging is a mandatory type. + path: the hdfs path for each location. + Falcon would use the location to do intermediate + processing of entities in hdfs and hence Falcon + should have read/write/execute permission on these + locations. + </xs:documentation> + </xs:annotation> + <xs:attribute type="cluster-location-type" name="name" use="required"/> + <xs:attribute type="xs:string" name="path" use="required"/> + </xs:complexType> + <xs:complexType name="interfaces"> + <xs:annotation> + <xs:documentation> + A list of interfaces. + </xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element type="interface" name="interface" maxOccurs="unbounded" minOccurs="3"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="interfacetype"> + <xs:annotation> + <xs:documentation> + An interface has 6 different interface types: readonly, write, + execute, workflow, messaging, registry. + readonly specifies the hadoop's hftp address, it's endpoint is the value of + dfs.http.address.ex: hftp://corp.namenode:50070/ + write specifies the interface to write to hdfs, it's endpoint is the value + of fs.defaultFS ex: hdfs://corp.namenode:8020 + execute specifies the interface for job tracker, it's endpoint is the value + of mapreduce.jobtracker.address. ex:corp.jt:8021 + workflow specifies the interface for workflow engine, example of it's + endpoint is value for OOZIE_URL.ex: http://corp.oozie:11000/oozie + messaging specifies the interface for sending feed availability messages, it's + endpoint is broker url with tcp address.ex: tcp://corp.messaging:61616?daemon=true + registry specifies the interface for Hcatalog. + spark specifies the interface for spark master. + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="readonly"/> + <xs:enumeration value="write"/> + <xs:enumeration value="execute"/> + <xs:enumeration value="workflow"/> + <xs:enumeration value="messaging"/> + <xs:enumeration value="registry"/> + <xs:enumeration value="spark"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="IDENTIFIER"> + <xs:restriction base="xs:string"> + <xs:pattern value="(([a-zA-Z]([\-a-zA-Z0-9])*){1,39})"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="KEY_VALUE_PAIR"> + <xs:restriction base="xs:string"> + <xs:pattern value="([\w_]+=[^,]+)?([,]?[ ]*[\w_]+=[^,]+)*"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="ACL"> + <xs:annotation> + <xs:documentation> + Access control list for this cluster. + owner is the Owner of this entity. + group is the one which has access to read - not used at this time. + permission is not enforced at this time + </xs:documentation> + </xs:annotation> + <xs:attribute type="xs:string" name="owner"/> + <xs:attribute type="xs:string" name="group"/> + <xs:attribute type="xs:string" name="permission" default="*"/> + </xs:complexType> + <xs:simpleType name="cluster-location-type"> + <xs:restriction base="xs:string"> + <xs:enumeration value="staging"/> + <xs:enumeration value="working"/> + <xs:enumeration value="temp"/> + </xs:restriction> + </xs:simpleType> +</xs:schema> http://git-wip-us.apache.org/repos/asf/falcon/blob/9e25ede1/common-types/src/main/resources/datasource-0.1.xsd ---------------------------------------------------------------------- diff --git a/common-types/src/main/resources/datasource-0.1.xsd b/common-types/src/main/resources/datasource-0.1.xsd new file mode 100644 index 0000000..d78d967 --- /dev/null +++ b/common-types/src/main/resources/datasource-0.1.xsd @@ -0,0 +1,282 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + --> + +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" + targetNamespace="uri:falcon:datasource:0.1" xmlns="uri:falcon:datasource:0.1" + xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"> + <xs:annotation> + <xs:documentation> + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + </xs:documentation> + <xs:appinfo> + <jaxb:schemaBindings> + <jaxb:package name="org.apache.falcon.entity.v0.datasource"/> + </jaxb:schemaBindings> + </xs:appinfo> + </xs:annotation> + <xs:element name="datasource" type="datasource"> + </xs:element> + <xs:complexType name="datasource"> + <xs:annotation> + <xs:documentation>The datasource contains various information required + to connect to a data source like a MySQL datasource or Kafka cluster. + A datasource is referenced by feeds that represent an object like + Table (or Topic) in the MySQL database (or Kafka Cluster). + name: the name of datasource, which must be unique. + colo: the name of the colo to which this datasource belongs to. + </xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element type="KEY_VALUE_PAIR" name="tags" minOccurs="0" maxOccurs="1"> + <xs:annotation> + <xs:documentation> + tags: a process specifies an optional list of comma separated tags, + Key Value Pairs, separated by comma, + which is used for classification of datasource entity. + Example: [email protected], [email protected], department=forecasting + </xs:documentation> + </xs:annotation> + </xs:element> + <xs:element type="interfaces" name="interfaces"/> + <xs:element type="driver" name="driver" minOccurs="1" maxOccurs="1" /> + <xs:element type="properties" name="properties" minOccurs="0"/> + <xs:element type="ACL" name="ACL" minOccurs="0" maxOccurs="1"/> + </xs:sequence> + <xs:attribute type="IDENTIFIER" name="name" use="required"/> + <xs:attribute type="xs:string" name="colo" use="required"/> + <xs:attribute type="xs:string" name="description"/> + <xs:attribute type="xs:int" name="version" use="optional" default="0"/> + <xs:attribute type="datasource-type" name="type" use="required"> + <xs:annotation> + <xs:documentation> + datasource type could be Relational Databases (MySQL, Oracle etc.), Messgaing systems like + Kafka, etc. + </xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:complexType> + <xs:complexType name="property"> + <xs:annotation> + <xs:documentation> + A key-value pair to pass in any datasource specific properties. + </xs:documentation> + </xs:annotation> + <xs:attribute type="xs:string" name="name" use="required"/> + <xs:attribute type="xs:string" name="value" use="required"/> + </xs:complexType> + <xs:complexType name="interface"> + <xs:annotation> + <xs:documentation> + An interface specifies the interface type (read or write), and an + endpoint url. Falcon uses these endpoints to import or export + data from datasources. + </xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element type="driver" name="driver" minOccurs="0" maxOccurs="1" /> + <xs:element type="credential" name="credential" minOccurs="0" maxOccurs="1"/> + <xs:element type="properties" name="properties" minOccurs="0"/> + </xs:sequence> + <xs:attribute type="interfacetype" name="type" use="required"/> + <xs:attribute type="xs:string" name="endpoint" use="required"/> + </xs:complexType> + <xs:complexType name="properties"> + <xs:annotation> + <xs:documentation> + A list of property elements. + </xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element type="property" name="property" maxOccurs="unbounded" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="interfaces"> + <xs:annotation> + <xs:documentation> + A list of interfaces. + </xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element type="interface" name="interface" maxOccurs="2" minOccurs="1"/> + <xs:element type="credential" name="credential" minOccurs="0" maxOccurs="1"/> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="interfacetype"> + <xs:annotation> + <xs:documentation> + An interface for datasource has 2 different interface types: readonly, write. + The readonly endpoint specifies the url/mechanism to use for data IMPORT operation + from a datasource while write endpoint specifies the url/mechanism to use for data + EXPORT operatrion. + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="readonly"/> + <xs:enumeration value="write"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="IDENTIFIER"> + <xs:restriction base="xs:string"> + <xs:pattern value="(([a-zA-Z]([\-a-zA-Z0-9])*){1,39})"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="KEY_VALUE_PAIR"> + <xs:restriction base="xs:string"> + <xs:pattern value="([\w_]+=[^,]+)?([,]?[ ]*[\w_]+=[^,]+)*"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="credential"> + <xs:sequence minOccurs="1" maxOccurs="1" > + <xs:element name="userName" minOccurs="1" maxOccurs="1" type="xs:string"> + <xs:annotation> + <xs:documentation> + The User for the datasource. + </xs:documentation> + </xs:annotation> + </xs:element> + + <xs:choice minOccurs="1" maxOccurs="1"> + <xs:element name="passwordFile" type="xs:string"> + <xs:annotation> + <xs:documentation> + The FQ path to a file on HDFS containing the datasource + server password with 400 permissions. Only the user + submitting the job has read access to this file which + will be securely passed to the mappers. + </xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="passwordText" type="xs:string"> + <xs:annotation> + <xs:documentation> + Plain text password. + </xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="passwordAlias" type="passwordAliasType"> + <xs:annotation> + <xs:documentation> + Password alias using hadoop credential store. + </xs:documentation> + </xs:annotation> + </xs:element> + </xs:choice> + </xs:sequence> + <xs:attribute name="type" type="credentialtype" use="required"/> + </xs:complexType> + <xs:complexType name="passwordAliasType"> + <xs:sequence minOccurs="1" maxOccurs="1"> + <xs:element name="alias" type="xs:string"> + <xs:annotation> + <xs:documentation> Provide password alias. </xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="providerPath" type="xs:string"> + <xs:annotation> + <xs:documentation>jceks provider HDFS file path </xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="credentialtype"> + <xs:annotation> + <xs:documentation> + user-password credentials are supported today which can be extended. + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="password-file" /> + <xs:enumeration value="password-text" /> + <xs:enumeration value="password-alias" /> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="datasource-type"> + <xs:annotation> + <xs:documentation> + The datasource type can be MySQL, ORACLE, Teradata etc. + </xs:documentation> + </xs:annotation> + <xs:restriction base="xs:string"> + <xs:enumeration value="mysql"/> + <xs:enumeration value="oracle"/> + <xs:enumeration value="hsql"/> + <xs:enumeration value="postgres"/> + <xs:enumeration value="db2"/> + <xs:enumeration value="netezza"/> + <xs:enumeration value="teradata"/> + <xs:enumeration value="generic"/> + </xs:restriction> + </xs:simpleType> + + <xs:complexType name="driver"> + <xs:annotation> + <xs:documentation> + Driver information. + </xs:documentation> + </xs:annotation> + <xs:sequence minOccurs="1" maxOccurs="1"> + <xs:element type="xs:string" name="clazz" minOccurs="1" maxOccurs="1"> + <xs:annotation> + <xs:documentation> + Fully qualified class name for the datasource driver used + for validating the datasource connection in Falcon. + </xs:documentation> + </xs:annotation> + </xs:element> + <xs:element type="xs:string" name="jar" minOccurs="1" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation> + Path to the connector jar files on HDFS thats shipped with the workflow. + You'd need to put the connector jar files in oozie sharelib and since this + is using all the latest features in sqoop 1.x, requires 1.5 snapshot. + </xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="ACL"> + <xs:annotation> + <xs:documentation> + Access control list for this Entity. + owner is the Owner of this entity. + group is the one which has access to read - not used at this time. + permission is not enforced at this time + </xs:documentation> + </xs:annotation> + <xs:attribute type="xs:string" name="owner"/> + <xs:attribute type="xs:string" name="group"/> + <xs:attribute type="xs:string" name="permission" default="*"/> + </xs:complexType> +</xs:schema>
