package org.batfish.question; import java.util.SortedSet; import java.util.TreeSet; import org.batfish.common.Answerer; import org.batfish.common.plugin.IBatfish; import org.batfish.datamodel.Topology; import org.batfish.datamodel.answers.AnswerElement; import org.batfish.datamodel.collections.NodeInterfacePair; import org.batfish.datamodel.collections.NodeSet; import org.batfish.datamodel.questions.IEnvironmentCreationQuestion; import org.batfish.datamodel.questions.Question; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; public class EnvironmentCreationQuestionPlugin extends QuestionPlugin { public static class EnvironmentCreationAnswerer extends Answerer { public EnvironmentCreationAnswerer(Question question, IBatfish batfish) { super(question, batfish); } @Override public AnswerElement answer() { EnvironmentCreationQuestion question = (EnvironmentCreationQuestion) _question; // TODO: add flag to question determining whether or not to compute // data // plane boolean dp = false; return _batfish.createEnvironment(question.getEnvironmentName(), question.getNodeBlacklist(), question.getInterfaceBlacklist(), question.getEdgeBlacklist(), dp); } } /** * Since this is not really a question; we do not document it as such. */ public static class EnvironmentCreationQuestion extends Question implements IEnvironmentCreationQuestion { private static final String EDGE_BLACKLIST_VAR = "edgeBlacklist"; private static final String ENVIRONMENT_NAME_VAR = ENVIRONMENT_NAME_KEY; private static final String INTERFACE_BLACKLIST_VAR = "interfaceBlacklist"; private static final String NODE_BLACKLIST_VAR = "nodeBlacklist"; private Topology _edgeBlacklist; private String _environmentName; private SortedSet<NodeInterfacePair> _interfaceBlacklist; private NodeSet _nodeBlacklist; @JsonCreator public EnvironmentCreationQuestion() { _nodeBlacklist = new NodeSet(); _interfaceBlacklist = new TreeSet<>(); } @Override public boolean getDataPlane() { return false; } @Override @JsonIgnore public boolean getDifferential() { return false; } @JsonProperty(EDGE_BLACKLIST_VAR) public Topology getEdgeBlacklist() { return _edgeBlacklist; } @JsonProperty(ENVIRONMENT_NAME_VAR) public String getEnvironmentName() { return _environmentName; } @JsonProperty(INTERFACE_BLACKLIST_VAR) public SortedSet<NodeInterfacePair> getInterfaceBlacklist() { return _interfaceBlacklist; } @Override public String getName() { return NAME; } @JsonProperty(NODE_BLACKLIST_VAR) public NodeSet getNodeBlacklist() { return _nodeBlacklist; } @Override public boolean getTraffic() { return false; } @JsonProperty(EDGE_BLACKLIST_VAR) public void setEdgeBlacklist(Topology edgeBlacklist) { _edgeBlacklist = edgeBlacklist; } @JsonProperty(ENVIRONMENT_NAME_VAR) public void setEnvironmentName(String environmentName) { _environmentName = environmentName; } @JsonProperty(INTERFACE_BLACKLIST_VAR) public void setInterfaceBlacklist( SortedSet<NodeInterfacePair> blacklist) { _interfaceBlacklist = blacklist; } @JsonProperty(NODE_BLACKLIST_VAR) public void setNodeBlacklist(NodeSet blacklist) { _nodeBlacklist = blacklist; } } @Override protected Answerer createAnswerer(Question question, IBatfish batfish) { return new EnvironmentCreationAnswerer(question, batfish); } @Override protected Question createQuestion() { return new EnvironmentCreationQuestion(); } }