I provide runtime implementation fot the Google Cloud provider.
diff --git a/core/.gitignore b/core/.gitignore
index c83d3a1..d7d470c 100644
--- a/core/.gitignore
+++ b/core/.gitignore
@@ -5,6 +5,7 @@
.terraform*
/azure
/aws
+/gcp
terraform.tfstate
terraform.tfstate.backup
diff --git a/core/Dockerfile b/core/Dockerfile
index 54d2be2..edb61d2 100644
--- a/core/Dockerfile
+++ b/core/Dockerfile
@@ -1,4 +1,4 @@
-FROM openjdk:8-jre-alpine
+FROM openjdk:8-jre
WORKDIR /
ADD target/jemo-*.jar jemo.jar
EXPOSE 80 443
diff --git a/core/pom.xml b/core/pom.xml
index ace8cde..5742bbf 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -22,7 +22,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.jemo</groupId>
<artifactId>jemo</artifactId>
- <version>1.0.2</version>
+ <version>1.0.3</version>
<packaging>jar</packaging>
<properties>
@@ -84,7 +84,13 @@
<dependency>
<groupId>org.mapdb</groupId>
<artifactId>mapdb</artifactId>
- <version>3.0.5</version>
+ <version>3.0.7</version>
+ <exclusions>
+ <exclusion>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<!-- include apache POI because it just sucks and therefore has to be loaded in the app server -->
@@ -192,7 +198,7 @@
<dependency>
<groupId>io.kubernetes</groupId>
<artifactId>client-java</artifactId>
- <version>3.0.0</version>
+ <version>4.0.0</version>
<scope>compile</scope>
</dependency>
@@ -202,6 +208,44 @@
<version>2.2.0</version>
</dependency>
+ <dependency>
+ <groupId>com.google.apis</groupId>
+ <artifactId>google-api-services-iam</artifactId>
+ <version>v1-rev20190201-1.28.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.google.apis</groupId>
+ <artifactId>google-api-services-cloudresourcemanager</artifactId>
+ <version>v1-rev547-1.25.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>27.0.1-jre</version>
+ </dependency>
+ <dependency>
+ <groupId>com.google.protobuf</groupId>
+ <artifactId>protobuf-java</artifactId>
+ <version>3.7.0</version>
+ </dependency>
+ <dependency>
+ <groupId>com.google.cloud</groupId>
+ <artifactId>google-cloud-datastore</artifactId>
+ <version>1.63.0</version>
+ </dependency>
+ <dependency>
+ <groupId>com.google.cloud</groupId>
+ <artifactId>google-cloud-storage</artifactId>
+ <version>1.63.0</version>
+ </dependency>
+ <dependency>
+ <groupId>com.google.cloud</groupId>
+ <artifactId>google-cloud-logging</artifactId>
+ <version>1.63.0</version>
+ </dependency>
+
</dependencies>
<build>
<plugins>
diff --git a/core/src/main/java/org/eclipse/jemo/AbstractJemo.java b/core/src/main/java/org/eclipse/jemo/AbstractJemo.java
index 1c6ac23..f938eb4 100644
--- a/core/src/main/java/org/eclipse/jemo/AbstractJemo.java
+++ b/core/src/main/java/org/eclipse/jemo/AbstractJemo.java
@@ -241,12 +241,7 @@
}
public void storeParamSet(String paramSetName) {
- Properties properties = Util.readPropertiesFile();
- if (properties == null) {
- properties = new Properties();
- }
- properties.setProperty(PARAM_SET_NAME, paramSetName);
- Util.storePropertiesFile(properties);
+ Util.addJemoProperty(PARAM_SET_NAME, paramSetName);
}
private void readParameters(CloudRuntime cloudRuntime) {
diff --git a/core/src/main/java/org/eclipse/jemo/api/JemoParameter.java b/core/src/main/java/org/eclipse/jemo/api/JemoParameter.java
index df116fd..f9fec3d 100644
--- a/core/src/main/java/org/eclipse/jemo/api/JemoParameter.java
+++ b/core/src/main/java/org/eclipse/jemo/api/JemoParameter.java
@@ -18,7 +18,6 @@
public enum JemoParameter {
CLOUD("eclipse.jemo.cloud"),
- REGION("eclipse.jemo.csp.region"),
LOCATION("eclipse.jemo.location"),
HTTPS_PORT("eclipse.jemo.https.port"),
HTTP_PORT("eclipse.jemo.http.port"),
diff --git a/core/src/main/java/org/eclipse/jemo/internal/model/AmazonAWSRuntime.java b/core/src/main/java/org/eclipse/jemo/internal/model/AmazonAWSRuntime.java
index 381f230..8e62a1d 100644
--- a/core/src/main/java/org/eclipse/jemo/internal/model/AmazonAWSRuntime.java
+++ b/core/src/main/java/org/eclipse/jemo/internal/model/AmazonAWSRuntime.java
@@ -112,7 +112,6 @@
import io.kubernetes.client.models.*;
import io.kubernetes.client.util.Config;
import org.eclipse.jemo.sys.JemoRuntimeSetup;
-import org.jetbrains.annotations.NotNull;
import java.io.*;
import java.math.BigInteger;
@@ -155,7 +154,9 @@
private static AWSCredentialsProvider AWS_CREDENTIALS_PROVIDER = null;
private static final ExecutorService EVENT_PROCESSOR = Executors.newCachedThreadPool();
private static final String[] DYNAMO_SYSTEM_TABLES = new String[]{"eclipse_jemo_module_configuration", "eclipse_jemo_security_groups", "eclipse_jemo_security_users", "eclipse_jemo_modules"};
+ public static final String AWS_REGION_PROP = "eclipse.jemo.aws.region";
private static String AWSREGION;
+
private String arn;
private static final String[] ACTION_NAMES = new String[]{
@@ -408,9 +409,9 @@
private String S3_PLUGIN_BUCKET;
public AmazonAWSRuntime() {
- AWSREGION = System.getProperty("eclipse.jemo.csp.region");
+ AWSREGION = System.getProperty("eclipse.jemo.aws.region");
if (AWSREGION == null) {
- AWSREGION = System.getenv("eclipse.jemo.csp.region");
+ AWSREGION = System.getenv("eclipse.jemo.aws.region");
}
}
@@ -1625,7 +1626,12 @@
delete(getDefaultCategory(), pluginJarFileName + ".crc32");
}
- @NotNull
+ @Override
+ public String isCliInstalled() {
+ final boolean isInstalled = isCommandInstalled("aws --help");
+ return isInstalled ? null : "Please install 'aws'. Instructions on https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html";
+ }
+
private Path prepareTerraformFiles(JemoRuntimeSetup.SetupParams setupParams) throws IOException {
final String terraformDir = getTerraformClusterDir();
final Path terraformDirPath = Paths.get(terraformDir);
@@ -1687,7 +1693,7 @@
" groups:\n" +
" - system:bootstrappers\n" +
" - system:nodes\n");
- coreV1Api.createNamespacedConfigMap("kube-system", configMap, null);
+ coreV1Api.createNamespacedConfigMap("kube-system", configMap, null, null, null);
reportAndLog(builder, "Creating the jemo pods...");
final V1StatefulSet v1StatefulSet = new V1StatefulSet()
@@ -1704,15 +1710,15 @@
.containers(asList(
new V1Container()
.name("jemo")
- .image("eclipse/jemo:1.0.2")
+ .image("eclipse/jemo:1.0.3")
.env(asList(
- new V1EnvVar().name(REGION.label()).value(AWSREGION),
+ new V1EnvVar().name(AWS_REGION_PROP).value(AWSREGION),
new V1EnvVar().name(CLOUD.label()).value("AWS"),
new V1EnvVar().name(HTTP_PORT.label()).value("80"),
new V1EnvVar().name(HTTPS_PORT.label()).value("443")))
.ports(singletonList(new V1ContainerPort().containerPort(80)))
)))));
- appsV1Api.createNamespacedStatefulSet("default", v1StatefulSet, null);
+ appsV1Api.createNamespacedStatefulSet("default", v1StatefulSet, null, null, null);
long start = System.currentTimeMillis();
long duration;
@@ -1737,7 +1743,7 @@
))
.putSelectorItem("app", "jemo")
.type("LoadBalancer"));
- coreV1Api.createNamespacedService("default", jemoLoadBalancerService, null);
+ coreV1Api.createNamespacedService("default", jemoLoadBalancerService, null, null, null);
return getLoadBalancerUrl(coreV1Api);
}
diff --git a/core/src/main/java/org/eclipse/jemo/internal/model/CloudLogEvent.java b/core/src/main/java/org/eclipse/jemo/internal/model/CloudLogEvent.java
index 2d37045..53780f1 100644
--- a/core/src/main/java/org/eclipse/jemo/internal/model/CloudLogEvent.java
+++ b/core/src/main/java/org/eclipse/jemo/internal/model/CloudLogEvent.java
@@ -29,6 +29,7 @@
private int moduleId = -1;
private String moduleName = null;
private double moduleVersion = 1.0;
+ private String level;
public CloudLogEvent(String message) {
this.message = message;
@@ -75,7 +76,15 @@
public void setModuleVersion(double moduleVersion) {
this.moduleVersion = moduleVersion;
}
-
+
+ public String getLevel() {
+ return level;
+ }
+
+ public void setLevel(String level) {
+ this.level = level;
+ }
+
@JsonIgnore
public CloudLogEvent withModuleId(int moduleId) {
setModuleId(moduleId);
diff --git a/core/src/main/java/org/eclipse/jemo/internal/model/CloudProvider.java b/core/src/main/java/org/eclipse/jemo/internal/model/CloudProvider.java
index 3fce7da..5110ab5 100644
--- a/core/src/main/java/org/eclipse/jemo/internal/model/CloudProvider.java
+++ b/core/src/main/java/org/eclipse/jemo/internal/model/CloudProvider.java
@@ -43,6 +43,8 @@
import java.util.List;
import static org.eclipse.jemo.api.JemoParameter.CLOUD;
+import static org.eclipse.jemo.internal.model.GCPRuntime.GCP_PROJECT_ID;
+import static org.eclipse.jemo.internal.model.GCPRuntime.GCP_SERVICE_ACCOUNT_ID;
import static org.eclipse.jemo.sys.internal.Util.readParameterFromJvmOrEnv;
import static java.util.Arrays.asList;
@@ -69,6 +71,13 @@
"Microsoft Azure",
asList("tenant_id", "client_id", "client_secret")),
+ GCP("org.eclipse.jemo.internal.model.GCPRuntime",
+ null,
+ "GCP",
+ "https://cloud.google.com/",
+ "Google Cloud",
+ asList(GCP_PROJECT_ID, GCP_SERVICE_ACCOUNT_ID)),
+
MEMORY("org.eclipse.jemo.runtime.MemoryRuntime",
null,
"MEMORY",
diff --git a/core/src/main/java/org/eclipse/jemo/internal/model/CloudRuntime.java b/core/src/main/java/org/eclipse/jemo/internal/model/CloudRuntime.java
index 9146454..bf3e30c 100644
--- a/core/src/main/java/org/eclipse/jemo/internal/model/CloudRuntime.java
+++ b/core/src/main/java/org/eclipse/jemo/internal/model/CloudRuntime.java
@@ -380,4 +380,12 @@
* @param pluginJarFileName the jar file name of the plugin under deletion
*/
void removePluginFiles(String pluginJarFileName);
+
+ /**
+ * Checks if the CLI tools of this CSP is installed and in the Path.
+ *
+ * @return null if the cli is installed and in the path, otherwise a message instructing the user to install it
+ */
+ String isCliInstalled();
+
}
diff --git a/core/src/main/java/org/eclipse/jemo/internal/model/GCPRuntime.java b/core/src/main/java/org/eclipse/jemo/internal/model/GCPRuntime.java
new file mode 100644
index 0000000..c15a490
--- /dev/null
+++ b/core/src/main/java/org/eclipse/jemo/internal/model/GCPRuntime.java
@@ -0,0 +1,1075 @@
+package org.eclipse.jemo.internal.model;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
+import com.google.api.services.cloudresourcemanager.CloudResourceManager;
+import com.google.api.services.iam.v1.Iam;
+import com.google.api.services.iam.v1.IamScopes;
+import com.google.auth.oauth2.GoogleCredentials;
+import com.google.cloud.MonitoredResource;
+import com.google.cloud.ServiceOptions;
+import com.google.cloud.datastore.*;
+import com.google.cloud.datastore.StructuredQuery.PropertyFilter;
+import com.google.cloud.logging.*;
+import com.google.cloud.storage.*;
+import com.google.cloud.storage.Blob;
+import com.google.cloud.storage.Storage.BlobListOption;
+import com.google.cloud.storage.Storage.BucketListOption;
+import io.kubernetes.client.ApiException;
+import org.eclipse.jemo.AbstractJemo;
+import org.eclipse.jemo.Jemo;
+import org.eclipse.jemo.sys.ClusterParams;
+import org.eclipse.jemo.sys.ClusterParams.ClusterParam;
+import org.eclipse.jemo.sys.JemoRuntimeSetup;
+import org.eclipse.jemo.sys.JemoRuntimeSetup.SetupParams;
+import org.eclipse.jemo.sys.internal.TerraformJob;
+import org.eclipse.jemo.sys.internal.TerraformJob.TerraformResult;
+import org.eclipse.jemo.sys.internal.Util;
+
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.security.GeneralSecurityException;
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
+import static com.google.api.client.googleapis.javanet.GoogleNetHttpTransport.newTrustedTransport;
+import static com.google.api.client.json.jackson2.JacksonFactory.getDefaultInstance;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
+import static java.nio.file.StandardOpenOption.CREATE;
+import static java.util.Arrays.asList;
+import static java.util.Collections.*;
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toSet;
+import static org.eclipse.jemo.sys.JemoRuntimeSetup.TFVARS_FILE_NAME;
+import static org.eclipse.jemo.sys.internal.Util.*;
+
+/**
+ * Implementation of the GCP cloud runtime.
+ *
+ * @author Yannis Theocharis
+ */
+public class GCPRuntime implements CloudRuntime {
+
+ private static final Logger LOG = Logger.getLogger(GCPRuntime.class.getSimpleName());
+ public static final String GCP_PROJECT_ID = "project_id";
+ public static final String GCP_SERVICE_ACCOUNT_ID = "service_account_id";
+ private static final String PROP_PROJECT_ID = "eclipse.jemo.gcp.project_id";
+ private static final String QUEUES_METADATA = "queues_metadata";
+ private static final String TABLES_METADATA = "tables_metadata";
+ private static final String MODULE_CONFIGURATION_TABLE = "eclipse_jemo_module_configuration";
+ private static final String ECLIPSE_JEMO_INSTANCES_TABLE = "eclipse_jemo_instances";
+ private static String CLOUD_STORAGE_PLUGIN_BUCKET;
+
+ private static final String APPLICATION_NAME = "Jemo";
+ private static GoogleCredential CREDENTIALS;
+ private static String PROJECT_ID;
+ private static final ExecutorService EVENT_PROCESSOR = Executors.newCachedThreadPool();
+ public static final String GCP_REGION_PROP = "eclipse.jemo.gcp.region";
+ private static String REGION;
+
+ private final Set<String> requiredRoles = new HashSet<String>() {{
+ add("roles/datastore.user");
+ add("roles/storage.admin");
+ add("roles/logging.admin");
+ }};
+ private Iam iam_client;
+ private Datastore datastore;
+ private Storage storage;
+ private Map<String, KeyFactory> kindToKeyFactory = new HashMap<>();
+ private Map<String, Bucket> categoryToBucket = new HashMap<>();
+ private Logging logging;
+ private final AtomicBoolean LOGGING_INITIALIZED = new AtomicBoolean(false);
+
+ public GCPRuntime() {
+ Properties properties = readPropertiesFile();
+ PROJECT_ID = readProperty(PROP_PROJECT_ID, properties, ServiceOptions.getDefaultProjectId());
+ REGION = readProperty(GCP_REGION_PROP, properties, null);
+ System.out.println("Env properties: " + System.getenv());
+ LOG(Level.INFO, String.format("Detected PROJECT_ID: [%s] and REGION: [%s]", PROJECT_ID, REGION));
+ }
+
+ private Datastore datastore() {
+ if (datastore == null) {
+ GoogleCredentials credentials = credentials();
+ datastore = DatastoreOptions.getDefaultInstance().toBuilder()
+ .setProjectId(PROJECT_ID)
+ .setCredentials(credentials)
+ .build()
+ .getService();
+ }
+ return datastore;
+ }
+
+ private GoogleCredentials credentials() {
+ try {
+ return GoogleCredentials.fromStream(new FileInputStream(jsonKeyFilePath("jemo-user", PROJECT_ID).toFile()))
+ .createScoped(singleton(IamScopes.CLOUD_PLATFORM));
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private GoogleCredential credential() {
+ try {
+ return GoogleCredential.fromStream(new FileInputStream(jsonKeyFilePath("jemo-user", PROJECT_ID).toFile()))
+ .createScoped(singleton(IamScopes.CLOUD_PLATFORM));
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private Storage storage() {
+ if (storage == null) {
+ GoogleCredentials credentials = credentials();
+ storage = StorageOptions.newBuilder()
+ .setCredentials(credentials)
+ .build().getService();
+ }
+ return storage;
+ }
+
+ private KeyFactory kindToKeyFactory(String kind) {
+ return kindToKeyFactory.computeIfAbsent(kind, k -> datastore().newKeyFactory().setKind(k));
+ }
+
+ @Override
+ public void start(AbstractJemo jemoServer) {
+ CLOUD_STORAGE_PLUGIN_BUCKET = "jemopluginlib-" + PROJECT_ID;
+ LOG.setUseParentHandlers(false);
+ LOG.addHandler(jemoServer.getConsoleHandler());
+ LOG.setLevel(jemoServer.getConsoleHandler().getLevel());
+ }
+
+ @Override
+ public void storeModuleList(String moduleJar, List<String> moduleList) throws Throwable {
+ final Bucket bucket = getOrCreateBucket(getDefaultCategory());
+ bucket.create(moduleJar + ".modulelist", Jemo.toJSONString(moduleList).getBytes(UTF_8));
+ }
+
+ @Override
+ public List<String> getModuleList(String moduleJar) throws Throwable {
+ final Bucket bucket = getOrCreateBucket(getDefaultCategory());
+ final String content = new String(bucket.get(moduleJar + ".modulelist").getContent(), UTF_8);
+ return Jemo.fromJSONArray(String.class, content);
+ }
+
+ @Override
+ public CloudBlob getModule(String moduleJar) throws IOException {
+ final Bucket bucket = getOrCreateBucket(getDefaultCategory());
+ final Blob blob = bucket.get(moduleJar);
+ if (blob == null) {
+ LOG(Level.INFO, "[%s][%s] the module could not be retrieved because it was not found in the plugin bucket %s", getClass().getSimpleName(), moduleJar, CLOUD_STORAGE_PLUGIN_BUCKET());
+ return null;
+ }
+ return new CloudBlob(moduleJar, blob.getUpdateTime(), blob.getContent().length, new ByteArrayInputStream(blob.getContent()));
+ }
+
+ @Override
+ public Long getModuleInstallDate(String moduleJar) throws IOException {
+ final Bucket bucket = getOrCreateBucket(getDefaultCategory());
+ final Blob blob = bucket.get(moduleJar + ".installed");
+ return blob == null ? null : Long.valueOf(new String(blob.getContent(), UTF_8));
+ }
+
+ @Override
+ public void setModuleInstallDate(String moduleJar, long installDate) throws IOException {
+ final Bucket bucket = getOrCreateBucket(getDefaultCategory());
+ bucket.create(moduleJar + ".installed", String.valueOf(installDate).getBytes(UTF_8));
+ }
+
+ private Logging logging() {
+ if (LOGGING_INITIALIZED.compareAndSet(false, true)) {
+ logging = LoggingOptions.newBuilder().setCredentials(credentials()).build().getService();
+ }
+ return logging;
+ }
+
+ @Override
+ public void log(List<CloudLogEvent> eventList) {
+ if (eventList == null) {
+ return;
+ }
+
+ final Map<String, List<CloudLogEvent>> goupidToLogEvents = eventList.stream()
+ .collect(Collectors.groupingBy((t) -> {
+ if (t.getModuleId() == -1) {
+ return "ECLIPSE-JEMO";
+ } else {
+ final String fileName = "ECLIPSE-JEMO_MODULE-" + t.getModuleId() + "-" + t.getModuleVersion() + "-" + t.getModuleName();
+ return fileName.replaceAll("[^\\.\\-_/#A-Za-z0-9]", "");
+ }
+ }));
+
+ goupidToLogEvents.forEach((k, v) -> {
+ final HashMap<String, String> labels = new HashMap<String, String>() {{
+ put("project_id", PROJECT_ID);
+ put("name", k);
+ }};
+ final Set<LogEntry> logEntries = v.parallelStream()
+ .map(event -> LogEntry.newBuilder(Payload.StringPayload.of(event.getMessage()))
+ .setSeverity(toGCPSeverity(event.getLevel()))
+ .setLogName(k)
+ .setResource(MonitoredResource.newBuilder("logging_log").setLabels(labels).build())
+ .setTimestamp(event.getTimestamp()).build())
+ .collect(toSet());
+ logging().write(logEntries);
+ });
+ }
+
+ private Severity toGCPSeverity(String level) {
+ if (level == null) {
+ return Severity.INFO;
+ }
+
+ switch (level) {
+ case "SEVERE":
+ return Severity.ERROR;
+ case "WARNING":
+ return Severity.WARNING;
+ case "INFO":
+ return Severity.INFO;
+ case "CONFIG":
+ return Severity.DEBUG;
+ case "FINE":
+ return Severity.DEBUG;
+ case "FINER":
+ return Severity.DEBUG;
+ case "FINEST":
+ return Severity.DEBUG;
+ default:
+ return Severity.DEFAULT;
+ }
+ }
+
+ @Override
+ public Set<String> listPlugins() {
+ Set<String> plugins = new HashSet<>();
+ final Bucket bucket = getOrCreateBucket(getDefaultCategory());
+ bucket.list().iterateAll().forEach(blob -> {
+ if (blob.getName().endsWith(".jar")) {
+ plugins.add(blob.getName());
+ }
+ });
+ return plugins;
+ }
+
+ @Override
+ public void uploadModule(String pluginFile, byte[] pluginBytes) {
+ final Bucket bucket = getOrCreateBucket(getDefaultCategory());
+ bucket.create(pluginFile, pluginBytes);
+ }
+
+ @Override
+ public void uploadModule(String pluginFile, InputStream in, long moduleSize) {
+ final Bucket bucket = getOrCreateBucket(getDefaultCategory());
+ bucket.create(pluginFile, in);
+ }
+
+ @Override
+ public String defineQueue(String queueName) {
+ saveNoSQL(QUEUES_METADATA, new SystemDBMetaData(queueName));
+ return queueName;
+ }
+
+ @Override
+ public String getQueueId(String queueName) {
+ try {
+ final SystemDBMetaData queuesMetaData = getNoSQL(QUEUES_METADATA, queueName, SystemDBMetaData.class);
+ return queuesMetaData == null ? null : queuesMetaData.getId();
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ @Override
+ public String getQueueName(String queueId) {
+ return queueId;
+ }
+
+ @Override
+ public List<String> listQueueIds(String location, boolean includeWorkQueues) {
+ final String prefix = "JEMO-" + (location == null ? "" : location);
+
+ return listNoSQL(QUEUES_METADATA, SystemDBMetaData.class).stream()
+ .filter(systemDBMetaData -> {
+ final String id = systemDBMetaData.getId();
+ final int index = id.lastIndexOf('/');
+ final String name = id.substring(index + 1);
+ return name.startsWith(prefix) &&
+ (!name.endsWith("-WORK-QUEUE") || includeWorkQueues);
+ })
+ .map(SystemDBMetaData::getId)
+ .collect(toList());
+ }
+
+ @Override
+ public int pollQueue(String queueId, CloudQueueProcessor processor) throws QueueDoesNotExistException {
+ try {
+ final SystemDBMetaData systemDBMetaData = getNoSQL(QUEUES_METADATA, queueId, SystemDBMetaData.class);
+ if (systemDBMetaData == null) {
+ throw new QueueDoesNotExistException("Queue id: " + queueId);
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ int[] messageNumber = {0};
+ final List<SystemDBMessage> systemDBMessages = listNoSQL(queueId, SystemDBMessage.class);
+ systemDBMessages.stream()
+ .limit(10).parallel()
+ .forEach(msg -> {
+ messageNumber[0]++;
+ //first we delete so nobody else will get this message.
+ deleteNoSQL(queueId, msg);
+ JemoMessage ccMsg = Util.F(msg, (SystemDBMessage x) -> Jemo.fromJSONString(JemoMessage.class, x.getJsonMessage()));
+
+ //the message will contain a relevant plugin-id so we will use that id to know what we need to run.
+ if (ccMsg != null) {
+ EVENT_PROCESSOR.submit(() -> processor.processMessage(ccMsg));
+ }
+ });
+ return messageNumber[0];
+ }
+
+ @Override
+ public void deleteQueue(String queueId) {
+ dropTable(QUEUES_METADATA, queueId);
+ }
+
+ @Override
+ public String sendMessage(String queueId, String jsonMessage) {
+ // Google PubSub service only delivers messages to active subscriptions.
+ // This means that a Jemo instance will miss all the messages sent before it has created its subscription.
+ // This is undesireable behaviour as Jemo instances can go down and restart again and we don't want to miss the messages send inbetween.
+ // Therefore, we save the message to datastore, under a kind named with queueId.
+ final SystemDBMessage systemDBMessage = new SystemDBMessage(jsonMessage);
+ saveNoSQL(queueId, systemDBMessage);
+ return systemDBMessage.getId();
+ }
+
+ @Override
+ public void createNoSQLTable(String tableName) {
+ // It is not possible to create an empty "Kind" (similar to teh relational "Table" or the document db "Collection" term) GCP datastore.
+ // The "Kind" is automatically created the first time an "Entity" (similar to "Row" or "Document") is added under the Kind.
+ // Similarly, the "Kind" is deleted when the last "Entity" under it is deleted.
+ // Therefore, we use a separate metadata table to store the names of "existing" tables.
+ saveNoSQL(TABLES_METADATA, new SystemDBMetaData(tableName));
+ }
+
+ @Override
+ public boolean hasNoSQLTable(String tableName) {
+ final KeyFactory keyFactory = kindToKeyFactory(TABLES_METADATA);
+ final Entity entity = datastore().get(keyFactory.newKey(tableName));
+ return entity != null;
+ }
+
+ @Override
+ public void dropNoSQLTable(String tableName) {
+ // Datastore does not provide a way to delete a collection.
+ // Instead, we need to list all the documents under the collection and delete each one of them.
+ dropTable(TABLES_METADATA, tableName);
+ }
+
+ public void dropTable(String metadataTable, String tableName) {
+ final Query<Entity> query = Query.newEntityQueryBuilder().setKind(tableName).build();
+ List<Key> keys = new ArrayList<>();
+ datastore().run(query).forEachRemaining(entity -> keys.add(entity.getKey()));
+ datastore().delete(keys.toArray(new Key[0]));
+ kindToKeyFactory.remove(tableName);
+ deleteNoSQL(metadataTable, new SystemDBMetaData(tableName));
+ }
+
+ @Override
+ public <T> List<T> listNoSQL(String tableName, Class<T> objectType) {
+ List<T> retval = new ArrayList<>();
+ try {
+ final Query<Entity> query = Query.newEntityQueryBuilder().setKind(tableName).build();
+ datastore().run(query).forEachRemaining(entity -> retval.add(deserialiseEntity(objectType, entity)));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return retval;
+ }
+
+ private <T> T deserialiseEntity(Class<T> objectType, Entity entity) {
+ final String dataAsString = entity.getString("data");
+ return Util.F(dataAsString, data -> Jemo.fromJSONString(objectType, data));
+ }
+
+ @Override
+ public <T> List<T> queryNoSQL(String tableName, Class<T> objectType, String... pkList) {
+ final KeyFactory keyFactory = kindToKeyFactory(tableName);
+ final Key[] keys = Arrays.stream(pkList)
+ .map(keyFactory::newKey)
+ .toArray(Key[]::new);
+ List<T> result = new ArrayList<>();
+ datastore().get(keys).forEachRemaining(entity -> result.add(deserialiseEntity(objectType, entity)));
+ return result;
+ }
+
+ @Override
+ public <T> T getNoSQL(String tableName, String id, Class<T> objectType) throws IOException {
+ if (!tableName.equals(QUEUES_METADATA) && !tableName.equals(TABLES_METADATA) && !hasNoSQLTable(tableName)) {
+ throw new IOException("Table does not exist, tableName: " + tableName);
+ }
+
+ final KeyFactory keyFactory = kindToKeyFactory(tableName);
+ final Entity entity = datastore().get(keyFactory.newKey(id));
+ if (entity == null) {
+ return null;
+ }
+
+ final String dataAsString = entity.getString("data");
+ try {
+ return Jemo.fromJSONString(objectType, dataAsString);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void saveNoSQL(String tableName, SystemDBObject... data) {
+ final KeyFactory keyFactory = kindToKeyFactory(tableName);
+ final Entity[] entities = Arrays.stream(data)
+ .map(datum -> {
+ StringValue myStringValue = StringValue.newBuilder(Jemo._safe_toJSONString(datum))
+ .setExcludeFromIndexes(true)
+ .build();
+ return Entity.newBuilder(keyFactory.newKey(datum.getId()))
+ .set("data", myStringValue)
+ .build();
+ })
+ .toArray(Entity[]::new);
+ datastore().put(entities);
+ }
+
+ @Override
+ public void deleteNoSQL(String tableName, SystemDBObject... data) {
+ final KeyFactory keyFactory = kindToKeyFactory(tableName);
+ final Key[] keys = Arrays.stream(data)
+ .map(datum -> keyFactory.newKey(datum.getId()))
+ .toArray(Key[]::new);
+ datastore().delete(keys);
+ }
+
+ @Override
+ public void watchdog(String location, String instanceId, String instanceQueueUrl) {
+ if (!hasNoSQLTable(instanceQueueUrl)) {
+ createNoSQLTable(ECLIPSE_JEMO_INSTANCES_TABLE);
+ }
+
+ final KeyFactory keyFactory = kindToKeyFactory(ECLIPSE_JEMO_INSTANCES_TABLE);
+ final Entity entity = Entity.newBuilder(keyFactory.newKey(instanceId))
+ .set("instance_id", instanceId)
+ .set("last_seen", System.currentTimeMillis())
+ .set("instance_location", location)
+ .set("instance_url", instanceQueueUrl)
+ .build();
+ datastore().put(entity);
+
+ final long inactivityPeriodThreshold = System.currentTimeMillis() - 7_200_000;
+ final Query<Entity> query = Query.newEntityQueryBuilder()
+ .setKind(instanceQueueUrl)
+ .setFilter(PropertyFilter.lt("last_seen", inactivityPeriodThreshold))
+ .build();
+ datastore().run(query).forEachRemaining(inactiveQueue -> dropNoSQLTable(inactiveQueue.getString("instance_url")));
+ }
+
+ @Override
+ public void setModuleConfiguration(int pluginId, ModuleConfiguration config) {
+ provisionConfigTable();
+ if (config != null && !config.getParameters().isEmpty()) {
+ final KeyFactory keyFactory = kindToKeyFactory(MODULE_CONFIGURATION_TABLE);
+ List<Key> keys = new ArrayList<>();
+ List<Entity> entitiesToUpdate = new ArrayList<>();
+ config.getParameters().forEach(p -> {
+ switch (p.getOperation()) {
+ case delete:
+ keys.add(keyFactory.newKey(pluginId + "_" + p.getKey()));
+ break;
+ case upsert:
+ entitiesToUpdate.add(Entity.newBuilder(keyFactory.newKey(pluginId + "_" + p.getKey()))
+ .set("key", p.getKey())
+ .set("value", p.getValue())
+ .build());
+ break;
+ }
+ });
+ datastore().delete(keys.toArray(new Key[0]));
+ datastore().put(entitiesToUpdate.toArray(new Entity[0]));
+ }
+ }
+
+ @Override
+ public Map<String, String> getModuleConfiguration(int pluginId) {
+ provisionConfigTable();
+ final Map<String, String> config = new HashMap<>();
+ Query<Entity> query = Query.newEntityQueryBuilder().setKind(MODULE_CONFIGURATION_TABLE).build();
+ datastore().run(query).forEachRemaining(entity -> {
+ if (entity.getKey().getName().startsWith(String.valueOf(pluginId))) {
+ config.put(entity.getString("key"), entity.getString("value"));
+ }
+ });
+ return config;
+ }
+
+ private void provisionConfigTable() {
+ if (!hasNoSQLTable(MODULE_CONFIGURATION_TABLE)) {
+ createNoSQLTable(MODULE_CONFIGURATION_TABLE);
+ }
+ }
+
+ @Override
+ public void store(String key, Object data) {
+ store(CLOUD_STORAGE_PLUGIN_BUCKET(), key, data);
+ }
+
+ private String CLOUD_STORAGE_PLUGIN_BUCKET() {
+ return CLOUD_STORAGE_PLUGIN_BUCKET;
+ }
+
+ @Override
+ public <T> T retrieve(String key, Class<T> objType) {
+ return retrieve(CLOUD_STORAGE_PLUGIN_BUCKET(), key, objType);
+ }
+
+ @Override
+ public void store(String category, String key, Object data) {
+ final Bucket bucket = getOrCreateBucket(category);
+ try {
+ final byte[] byteData = Jemo.toJSONString(data).getBytes(UTF_8);
+ bucket.create(Jemo.md5(key) + ".datastore", byteData, "application/json");
+ } catch (JsonProcessingException | NoSuchAlgorithmException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private Bucket getOrCreateBucket(String category) {
+ return categoryToBucket.computeIfAbsent(category, key -> {
+ final String bucketName = buildBucketName(category);
+ final Iterator<Bucket> buckets = storage().list(BucketListOption.pageSize(1), BucketListOption.prefix(bucketName)).iterateAll().iterator();
+ return buckets.hasNext() ? buckets.next() : storage().create(
+ BucketInfo.newBuilder(bucketName)
+ // See here for possible values: http://g.co/cloud/storage/docs/storage-classes
+ .setStorageClass(StorageClass.REGIONAL)
+ // Possible values: http://g.co/cloud/storage/docs/bucket-locations#location-mr
+ .setLocation(REGION.substring(0, REGION.lastIndexOf('-')))
+ .build());
+ });
+ }
+
+ private String buildBucketName(String name) {
+ final String suffix = name.endsWith(PROJECT_ID) ? "" : "-" + PROJECT_ID;
+
+ //all bucket names must be relevant to the current account otherwise there will be conflicts
+ return name.toLowerCase().replaceAll("[\\_\\.]", "-") + suffix;
+ }
+
+ @Override
+ public <T> T retrieve(String category, String key, Class<T> objType) {
+ final Bucket bucket = getOrCreateBucket(category);
+ try {
+ final Blob blob = bucket.get(Jemo.md5(key) + ".datastore");
+ return blob == null ? null : Jemo.fromJSONString(objType, new String(blob.getContent()));
+ } catch (IOException | StorageException e) {
+ return null;
+ } catch (NoSuchAlgorithmException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void delete(String category, String key) {
+ final String bucketName = buildBucketName(category);
+ try {
+ final BlobId blobId = BlobId.of(bucketName, Jemo.md5(key) + ".datastore");
+ storage().delete(blobId);
+ } catch (NoSuchAlgorithmException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public String getDefaultCategory() {
+ return CLOUD_STORAGE_PLUGIN_BUCKET();
+ }
+
+ @Override
+ public void write(String category, String path, String key, InputStream dataStream) {
+ final Bucket bucket = getOrCreateBucket(category);
+ bucket.create(path + "/" + key, dataStream);
+ }
+
+ @Override
+ public InputStream read(String category, String path, String key) {
+ final Bucket bucket = getOrCreateBucket(category);
+ final Blob blob = bucket.get(path + "/" + key);
+ if (blob == null) {
+ return null;
+ }
+
+ try {
+ return new ByteArrayInputStream(blob.getContent());
+ } catch (StorageException e) {
+ return null;
+ }
+ }
+
+ @Override
+ public Stream<InputStream> readAll(String category, String path) {
+ final Bucket bucket = getOrCreateBucket(category);
+ return StreamSupport.stream(bucket.list(BlobListOption.prefix(path + "/")).iterateAll().spliterator(), true)
+ .map(blob -> (InputStream) new ByteArrayInputStream(blob.getContent()))
+ .parallel();
+ }
+
+ @Override
+ public void remove(String category, String path, String key) {
+ final String bucketName = buildBucketName(category);
+ final BlobId blobId = BlobId.of(bucketName, path == null ? key : path + "/" + key);
+ storage().delete(blobId);
+ }
+
+ @Override
+ public ValidationResult validatePermissions() {
+ try {
+ if (iam_client == null) {
+ ValidationResult validationResult = validateCredentials(credential());
+ if (!validationResult.isSuccess()) {
+ return validationResult;
+ }
+ }
+
+ final CloudResourceManager cloudResourceManager = new CloudResourceManager.Builder(newTrustedTransport(), getDefaultInstance(), CREDENTIALS)
+ .setApplicationName(APPLICATION_NAME)
+ .build();
+
+ final List<com.google.api.services.cloudresourcemanager.model.Binding> bindings = cloudResourceManager.projects().getIamPolicy(CREDENTIALS.getServiceAccountProjectId(), null).execute().getBindings();
+ final String jemoServiceAccount = "serviceAccount:" + CREDENTIALS.getServiceAccountId();
+ final Set<String> grantedRoles = bindings.stream()
+ .filter(binding -> binding.getMembers().contains(jemoServiceAccount))
+ .map(binding -> binding.getRole())
+ .collect(toSet());
+ if (grantedRoles.contains("roles/owner")) {
+ return ValidationResult.SUCCESS;
+ }
+
+ final List<String> notGrantedRoles = requiredRoles.stream()
+ .filter(requiredPermission -> !grantedRoles.contains(requiredPermission))
+ .collect(toList());
+
+ ValidationResult validationResult = new ValidationResult(notGrantedRoles);
+ if (!validationResult.isSuccess()) {
+ LOG(Level.WARNING, String.format("The following user permissions are missing: [%s]", notGrantedRoles));
+ }
+ return validationResult;
+ } catch (Exception e) {
+ return new ValidationResult(singletonList(e.getMessage()));
+ }
+ }
+
+ @Override
+ public ValidationResult validateCredentials(Map<String, String> credentials) {
+ final String projectId = credentials.get(GCP_PROJECT_ID);
+ final String serviceAccountName = credentials.get(GCP_SERVICE_ACCOUNT_ID);
+
+ try {
+ final Path credentialsFilePath = jsonKeyFilePath(serviceAccountName, projectId);
+ final GoogleCredential credential = GoogleCredential
+ .fromStream(new FileInputStream(credentialsFilePath.toFile()))
+ .createScoped(singleton(IamScopes.CLOUD_PLATFORM));
+ final ValidationResult validationResult = validateCredentials(credential);
+ if (validationResult.isSuccess()) {
+ PROJECT_ID = projectId;
+ // Also add the jemo role to the required roles, as this requires knowing the PROJECT_ID.
+ requiredRoles.add("projects/" + PROJECT_ID + "/roles/jemoRole");
+ }
+ return validationResult;
+ } catch (IOException e) {
+ LOG.log(Level.FINE, String.format("User credentials validation failed: [%s].", e.getMessage()));
+ return new ValidationResult(singletonList(e.getMessage()));
+ }
+ }
+
+ public ValidationResult validateCredentials(GoogleCredential credential) {
+ try {
+ final Iam iamClient = new Iam.Builder(newTrustedTransport(), getDefaultInstance(), credential)
+ .setApplicationName(APPLICATION_NAME)
+ .build();
+
+ iamClient.projects().serviceAccounts().get("projects/" + credential.getServiceAccountProjectId() + "/serviceAccounts/" + credential.getServiceAccountId()).execute();
+ iam_client = iamClient;
+ CREDENTIALS = credential;
+ return ValidationResult.SUCCESS;
+ } catch (GeneralSecurityException | IOException e) {
+ return new ValidationResult(singletonList("Credentials validation failed. GCP responded with: \n\n" + e.getMessage()));
+ }
+ }
+
+ @Override
+ public void updateCredentials(Map<String, String> credentials) {
+ // Do nothing.
+ }
+
+ private Path jsonKeyFilePath(String userAccountId, String projectId) {
+ if (System.getenv("GOOGLE_APPLICATION_CREDENTIALS") != null) {
+ return Paths.get(System.getenv("GOOGLE_APPLICATION_CREDENTIALS"));
+ } else {
+ return gcpDirectory().resolve(jsonKeyFileName(userAccountId, projectId));
+ }
+ }
+
+ private String jsonKeyFileName(String userAccountId, String projectId) {
+ return userAccountId + "@" + projectId + "-cred.json";
+ }
+
+ @Override
+ public void setRegion(String regionCode) {
+ REGION = regionCode;
+ addJemoProperty(GCP_REGION_PROP, regionCode);
+ }
+
+ @Override
+ public String readInstanceTag(String key) {
+ return null;
+ }
+
+ @Override
+ public List<RegionInfo> getRegions() {
+ return asList(new RegionInfo("us-east1-b", "South Carolina-b"),
+ new RegionInfo("us-east1-c", "South Carolina-c"),
+ new RegionInfo("us-east1-d", "South Carolina-d"),
+ new RegionInfo("us-east4-a", "N. Virginia-a"),
+ new RegionInfo("us-east4-b", "N. Virginia-b"),
+ new RegionInfo("us-east4-c", "N. Virginia-c"),
+ new RegionInfo("us-central1-a", "Iowa-a"),
+ new RegionInfo("us-central1-b", "Iowa-b"),
+ new RegionInfo("us-central1-c", "Iowa-c"),
+ new RegionInfo("us-central1-f", "Iowa-f"),
+ new RegionInfo("us-west1-a", "Oregon-a"),
+ new RegionInfo("us-west1-b", "Oregon-b"),
+ new RegionInfo("us-west1-c", "Oregon-c"),
+ new RegionInfo("europe-west4-a", "Netherlands-a"),
+ new RegionInfo("europe-west4-b", "Netherlands-b"),
+ new RegionInfo("europe-west4-c", "Netherlands-c"),
+ new RegionInfo("europe-west1-b", "Belgium-b"),
+ new RegionInfo("europe-west1-c", "Belgium-c"),
+ new RegionInfo("europe-west1-d", "Belgium-d"),
+ new RegionInfo("europe-west3-a", "Frankfurt-a"),
+ new RegionInfo("europe-west3-b", "Frankfurt-b"),
+ new RegionInfo("europe-west3-c", "Frankfurt-c"),
+ new RegionInfo("europe-west2-a", "London-a"),
+ new RegionInfo("europe-west2-b", "London-b"),
+ new RegionInfo("europe-west2-c", "London-c"),
+ new RegionInfo("asia-east1-a", "Taiwan-a"),
+ new RegionInfo("asia-east1-b", "Taiwan-b"),
+ new RegionInfo("asia-east1-c", "Taiwan-c"),
+ new RegionInfo("asia-southeast1-a", "Singapore-a"),
+ new RegionInfo("asia-southeast1-b", "Singapore-b"),
+ new RegionInfo("asia-southeast1-c", "Singapore-c"),
+ new RegionInfo("asia-northeast1-a", "Tokyo-a"),
+ new RegionInfo("asia-northeast1-b", "Tokyo-b"),
+ new RegionInfo("asia-northeast1-c", "Tokyo-c"),
+ new RegionInfo("asia-south1-a", "Mumbai-a"),
+ new RegionInfo("asia-south1-b", "Mumbai-b"),
+ new RegionInfo("asia-south1-c", "Mumbai-c"),
+ new RegionInfo("australia-southeast1-a", "Sydney-a"),
+ new RegionInfo("australia-southeast1-b", "Sydney-b"),
+ new RegionInfo("australia-southeast1-c", "Sydney-c"),
+ new RegionInfo("southamerica-east1-a", "Sao Paulo-a"),
+ new RegionInfo("southamerica-east1-b", "Sao Paulo-b"),
+ new RegionInfo("southamerica-east1-c", "Sao Paulo-c"),
+ new RegionInfo("asia-east2-a", "Hong Kong-a"),
+ new RegionInfo("asia-east2-b", "Hong Kong-b"),
+ new RegionInfo("asia-east2-c", "Hong Kong-c"),
+ new RegionInfo("asia-northeast2-a", "Osaka-a"),
+ new RegionInfo("asia-northeast2-b", "Osaka-b"),
+ new RegionInfo("asia-northeast2-c", "Osaka-c"),
+ new RegionInfo("europe-north1-a", "Finland-a"),
+ new RegionInfo("europe-north1-b", "Finland-b"),
+ new RegionInfo("europe-north1-c", "Finland-c"),
+ new RegionInfo("europe-west6-a", "Zurich-a"),
+ new RegionInfo("europe-west6-b", "Zurich-b"),
+ new RegionInfo("europe-west6-c", "Zurich-c"),
+ new RegionInfo("northamerica-northeast1-a", "Montreal-a"),
+ new RegionInfo("northamerica-northeast1-b", "Montreal-b"),
+ new RegionInfo("northamerica-northeast1-c", "Montreal-c"),
+ new RegionInfo("us-west2-a", "Los Angeles-a"),
+ new RegionInfo("us-west2-b", "Los Angeles-b"),
+ new RegionInfo("us-west2-c", "Los Angeles-c"));
+ }
+
+ @Override
+ public void resetLogConsoleHandler(Handler handler) {
+ LOG.removeHandler(LOG.getHandlers()[0]);
+ LOG.addHandler(handler);
+ LOG.setLevel(handler.getLevel());
+ }
+
+ @Override
+ public List<String> getExistingNetworks() {
+ return null;
+ }
+
+ @Override
+ public List<String> getCustomerManagedPolicies() {
+ return null;
+ }
+
+ @Override
+ public ValidationResult validatePolicy(String policyName) {
+ return null;
+ }
+
+ @Override
+ public JemoRuntimeSetup.ClusterCreationResponse createCluster(SetupParams setupParams, StringBuilder builder) throws IOException, ApiException {
+ final Path terraformDirPath = createClusterTerraformTemplates(setupParams);
+ final TerraformJob terraformJob = new TerraformJob(terraformDirPath.toString(), terraformDirPath.toString() + "/" + TFVARS_FILE_NAME).run(builder);
+ final Path source = Paths.get("terraform.tfstate");
+ if (Files.exists(source)) {
+ Files.copy(source, terraformDirPath.resolve("terraform.tfstate"));
+ }
+
+ final String kubernetesDir = getTerraformClusterDir() + "/kubernetes/";
+ runProcess(builder, new String[]{
+ "/bin/sh", "-c", "gcloud container clusters get-credentials jemo-cluster ; " +
+ "kubectl create -f " + kubernetesDir + "/credentials.yaml ; " +
+ "kubectl create -f " + kubernetesDir + "/jemo-statefulset.yaml ; " +
+ "kubectl rollout status statefulset jemo ;" +
+ "kubectl create -f " + kubernetesDir + "/jemo-svc.yaml"
+ });
+
+ final String loadBalancerUrl = loadBalancerUrl(builder);
+ return JemoRuntimeSetup.ClusterCreationResponse.fromTerraformJob(terraformJob).setLoadBalancerUrl(loadBalancerUrl);
+ }
+
+ private String loadBalancerUrl(StringBuilder builder) throws IOException {
+ long start = System.currentTimeMillis();
+ long duration;
+ duration = (System.currentTimeMillis() - start) / 60_000;
+
+ String[] result;
+ do {
+ Util.B(null, x -> TimeUnit.SECONDS.sleep(10));
+ result = runProcess(builder, new String[]{
+ "/bin/sh", "-c", "kubectl get svc jemo -o=jsonpath='{.status.loadBalancer.ingress[0].ip}'"
+ });
+ } while (duration < 3 && result[0].isEmpty());
+
+ return "http://" + result[0];
+ }
+
+ @Override
+ public Path createClusterTerraformTemplates(SetupParams setupParams) throws IOException {
+ prepareClusterCreation(setupParams);
+ final Path terraformDirPath = prepareTerraformFiles(setupParams);
+
+ final Path kubernetesDirPath = terraformDirPath.resolve("kubernetes");
+ if (!Files.exists(kubernetesDirPath)) {
+ Files.createDirectory(kubernetesDirPath);
+ }
+ final String sourceDir = getTerraformClusterDir() + "/kubernetes/";
+ copy(sourceDir, kubernetesDirPath, "jemo-svc.yaml", getClass());
+
+ final String jemoKeyFileContent = Files.lines(jsonKeyFilePath("jemo-user", PROJECT_ID)).collect(Collectors.joining("\n"));
+ final String encodedJemoKeyFileContent = Base64.getEncoder().encodeToString(jemoKeyFileContent.getBytes(UTF8_CHARSET));
+ applyTemplate(sourceDir, kubernetesDirPath, "credentials.yaml", getClass(), x -> x.replaceAll("_JEMO_USER_CRED_", encodedJemoKeyFileContent));
+
+ final String replicas = setupParams.parameters().get("gcp_cluster_count");
+ applyTemplate(sourceDir, kubernetesDirPath, "jemo-statefulset.yaml", getClass(), x -> x.replaceAll("_JEMO_REPLICAS_", replicas).replaceAll("_REGION_", REGION));
+
+ return terraformDirPath;
+ }
+
+ private Path prepareTerraformFiles(JemoRuntimeSetup.SetupParams setupParams) throws IOException {
+ final String terraformDir = getTerraformClusterDir();
+ final Path terraformDirPath = Paths.get(terraformDir);
+ if (Files.exists(terraformDirPath)) {
+ Util.deleteDirectory(terraformDirPath.toFile());
+ }
+ Files.createDirectories(terraformDirPath);
+
+ copy(terraformDir, terraformDirPath, "README.txt", getClass());
+ copy(terraformDir, terraformDirPath, "variables.tf", getClass());
+ copy(terraformDir, terraformDirPath, "cluster.tf", getClass());
+
+ setupParams.parameters().put("region", REGION);
+ setupParams.parameters().put("project_id", PROJECT_ID);
+ setupParams.parameters().put("credentials_file", jsonKeyFilePath("terraform-user", PROJECT_ID).toString());
+ final String varsFileContent = setupParams.parameters().keySet().stream()
+ .filter(key -> !key.equals("containersPerParamSet"))
+ .map(key -> key + "=\"" + setupParams.parameters().get(key) + "\"")
+ .collect(Collectors.joining("\n"));
+
+ Files.write(Paths.get(terraformDirPath.toString() + "/" + JemoRuntimeSetup.TFVARS_FILE_NAME), varsFileContent.getBytes(), CREATE);
+ return terraformDirPath;
+ }
+
+ @Override
+ public List<InstallProperty> getInstallProperties() {
+ return null;
+ }
+
+ @Override
+ public void setInstallProperties(Map<String, String> properties) {
+ final String userAccountId = properties.get("user_account_id");
+ final Path jsonKeyFilePath = jsonKeyFilePath(userAccountId, PROJECT_ID);
+ Util.B(jsonKeyFilePath, Files::deleteIfExists);
+ Util.B(jsonKeyFilePath, (path) -> Files.copy(Paths.get(getTerraformInstallDir()).resolve(path.getFileName().toString()), path, REPLACE_EXISTING));
+ addJemoProperty(PROP_PROJECT_ID, PROJECT_ID);
+ }
+
+ @Override
+ public JemoRuntimeSetup.TerraformJobResponse install(String region, StringBuilder builder) throws IOException {
+ final Path terraformDirPath = createInstallTerraformTemplates(region);
+
+ // Enabling GCP APIs with terraform take some time to take effect on GCP. The APIs appear as enabled on the GCP console
+ // but if we send request immediately, they fail with a message that the API is not enabled. This behaviour lasts for 20-30 secs after the service is enabled,
+ // Therefore, I wait for a minute after terraform has finished.
+ final TerraformJob terraformJob = new TerraformJob(terraformDirPath.toString(), terraformDirPath.toString() + "/" + JemoRuntimeSetup.TFVARS_FILE_NAME)
+ .withDelay(TimeUnit.MINUTES, 1)
+ .run(builder);
+ Files.copy(Paths.get("terraform.tfstate"), terraformDirPath.resolve("terraform.tfstate"));
+ return JemoRuntimeSetup.TerraformJobResponse.fromTerraformJob(terraformJob);
+ }
+
+ @Override
+ public Path createInstallTerraformTemplates(String region) throws IOException {
+ final String terraformDir = getTerraformInstallDir();
+ final Path terraformDirPath = Paths.get(terraformDir);
+ if (Files.exists(terraformDirPath)) {
+ // Delete files from previous runs.
+ Util.deleteDirectory(terraformDirPath.toFile());
+ }
+ Files.createDirectories(terraformDirPath);
+
+ copy(terraformDir, terraformDirPath, "install.tf", getClass());
+ copy(terraformDir, terraformDirPath, "variables.tf", getClass());
+ if (region != null) {
+ final String tfvarsFileContent = "project_id=\"" + PROJECT_ID + "\"\n" +
+ "region=\"" + region + "\"\n" +
+ "credentials_file=\"" + jsonKeyFilePath("terraform-user", PROJECT_ID) + "\"\n";
+ Files.write(Paths.get(terraformDirPath.toString() + "/" + JemoRuntimeSetup.TFVARS_FILE_NAME), tfvarsFileContent.getBytes(), CREATE);
+ }
+ return terraformDirPath;
+ }
+
+ @Override
+ public Map<String, String> getCredentialsFromTerraformResult(TerraformResult terraformResult) {
+ return null;
+ }
+
+ @Override
+ public AdminUserCreationInstructions getAdminUserCreationInstructions() {
+ return new AdminUserCreationInstructions("Jemo setup requires a GCP service account with the \"Owner\" role to run terraform with.",
+ asList("Create a service account with the \"terraform-user\" name: \ngcloud iam service-accounts create terraform-user",
+ "Attach the \"Owner\" role to terraform-user (replace PROJECT_ID with your project id): \ngcloud projects add-iam-policy-binding [PROJECT_ID] --member \"serviceAccount:terraform-user@[PROJECT_ID].iam.gserviceaccount.com\" --role \"roles/owner\"",
+ "Create a json key file to be used by terraform to retrieve the credentials: \ngcloud iam service-accounts keys create terraform-user@[PROJECT_ID]-cred.json --iam-account terraform-user@[PROJECT_ID].iam.gserviceaccount.com",
+ "Create a directory \"~/.gcp\" and copy the json key file there: \nmkdir ~/.gcp; \ncp terraform-user@[PROJECT_ID]-cred.json ~/.gcp/"
+ ));
+ }
+
+ @Override
+ public ClusterParams getClusterParameters() {
+ return new ClusterParams(
+ singletonList(new ClusterParam("cluster_name", "jemo-cluster", "the cluster name")),
+ singletonList(new ClusterParam("gcp_cluster_count", "2", "the number of nodes")),
+ emptyList()
+ );
+ }
+
+ @Override
+ public void deleteKubernetesResources(StringBuilder builder) throws IOException {
+ // Do nothing, "terraform destroy" succeeds on GCP even if kubernetes pods and services are running.
+ }
+
+ @Override
+ public String getCspLabel() {
+ return "gcp";
+ }
+
+ @Override
+ public void removePluginFiles(String pluginJarFileName) {
+ remove(null, pluginJarFileName);
+ remove(null, pluginJarFileName + ".installed");
+ remove(null, pluginJarFileName + ".modulelist");
+ delete(getDefaultCategory(), pluginJarFileName + ".classlist");
+ delete(getDefaultCategory(), pluginJarFileName + ".crc32");
+ }
+
+ @Override
+ public String isCliInstalled() {
+ final boolean isInstalled = isCommandInstalled("gcloud --help");
+ return isInstalled ? null : "Please install 'gcloud'. Instructions on https://cloud.google.com/sdk/install";
+ }
+
+ private static Path gcpDirectory() {
+ final Path gcpDirPath = Util.pathUnderHomdeDir(".gcp");
+ if (!Files.exists(gcpDirPath)) {
+ Util.B(gcpDirPath, path -> Files.createDirectory(path));
+ }
+ return gcpDirPath;
+ }
+
+ private static final void LOG(Level logLevel, String message, Object... args) {
+ LOG.log(logLevel, message, args);
+ }
+
+ private static class SystemDBMessage implements SystemDBObject {
+
+ private String id;
+ private String jsonMessage;
+
+ public SystemDBMessage() {
+ }
+
+ public SystemDBMessage(String jsonMessage) {
+ id = UUID.randomUUID().toString();
+ this.jsonMessage = jsonMessage;
+ }
+
+ @Override
+ public String getId() {
+ return id;
+ }
+
+ public String getJsonMessage() {
+ return jsonMessage;
+ }
+ }
+
+ private static class SystemDBMetaData implements SystemDBObject {
+
+ private String id;
+
+ public SystemDBMetaData() {
+ }
+
+ public SystemDBMetaData(String id) {
+ this.id = id;
+ }
+
+ @Override
+ public String getId() {
+ return id;
+ }
+
+ }
+}
diff --git a/core/src/main/java/org/eclipse/jemo/internal/model/JemoLogFormatter.java b/core/src/main/java/org/eclipse/jemo/internal/model/JemoLogFormatter.java
index ec04f0a..83121f7 100644
--- a/core/src/main/java/org/eclipse/jemo/internal/model/JemoLogFormatter.java
+++ b/core/src/main/java/org/eclipse/jemo/internal/model/JemoLogFormatter.java
@@ -137,6 +137,7 @@
String[] loggerName = record.getLoggerName().split("\\:");
CloudLogEvent logEvent = new CloudLogEvent(logLine.toString());
+ logEvent.setLevel(record.getLevel().getLocalizedName());
if (loggerName.length == 3) { //if we cannot identify a module then this will go to the default log.
logEvent.setModuleId(Integer.parseInt(loggerName[0]));
logEvent.setModuleVersion(Double.parseDouble(loggerName[1]));
diff --git a/core/src/main/java/org/eclipse/jemo/runtime/MemoryRuntime.java b/core/src/main/java/org/eclipse/jemo/runtime/MemoryRuntime.java
index 90a26ac..bd7d2c7 100644
--- a/core/src/main/java/org/eclipse/jemo/runtime/MemoryRuntime.java
+++ b/core/src/main/java/org/eclipse/jemo/runtime/MemoryRuntime.java
@@ -615,4 +615,9 @@
remove(MODULE_STORAGE_PATH, pluginJarFileName);
}
+ @Override
+ public String isCliInstalled() {
+ return null;
+ }
+
}
diff --git a/core/src/main/java/org/eclipse/jemo/sys/JemoRuntimeMonitor.java b/core/src/main/java/org/eclipse/jemo/sys/JemoRuntimeMonitor.java
index 9bb9835..5e2a91c 100644
--- a/core/src/main/java/org/eclipse/jemo/sys/JemoRuntimeMonitor.java
+++ b/core/src/main/java/org/eclipse/jemo/sys/JemoRuntimeMonitor.java
@@ -22,7 +22,6 @@
import org.eclipse.jemo.sys.JemoPluginManager.PluginManagerModule;
import org.eclipse.jemo.sys.auth.JemoUser;
import org.eclipse.jemo.sys.internal.Util;
-import org.jetbrains.annotations.NotNull;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -152,7 +151,7 @@
}
@Override
- public int compareTo(@NotNull Object o) {
+ public int compareTo(Object o) {
Plugin that = (Plugin)o;
return this.pluginInfo.compareTo(that.pluginInfo);
}
@@ -179,7 +178,7 @@
}
@Override
- public int compareTo(@NotNull Object o) {
+ public int compareTo(Object o) {
PluginInfo that = (PluginInfo)o;
if (this.id != that.id) {
return this.id - that.id;
diff --git a/core/src/main/java/org/eclipse/jemo/sys/JemoRuntimeSetup.java b/core/src/main/java/org/eclipse/jemo/sys/JemoRuntimeSetup.java
index 5d85eac..f33d993 100644
--- a/core/src/main/java/org/eclipse/jemo/sys/JemoRuntimeSetup.java
+++ b/core/src/main/java/org/eclipse/jemo/sys/JemoRuntimeSetup.java
@@ -25,7 +25,6 @@
import org.eclipse.jemo.sys.internal.TerraformJob.TerraformResult;
import org.eclipse.jemo.sys.internal.Util;
import com.fasterxml.jackson.annotation.JsonProperty;
-import org.jetbrains.annotations.NotNull;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -253,13 +252,20 @@
return;
}
- if (!Util.isKubectlInstalled()) {
+ if (!Util.isCommandInstalled("kubectl --help")) {
respondWithJson(400, response, new SetupError(KUBECTL_NOT_INSTALLED, null));
return;
}
final SetupParams setupParams = Jemo.fromJSONString(SetupParams.class, Util.toString(request.getInputStream()));
final CloudRuntime cloudRuntime = CloudProvider.getRuntimeByName(setupParams.csp);
+
+ final String cliInstalled = cloudRuntime.isCliInstalled();
+ if (cliInstalled != null) {
+ respondWithJson(400, response, new SetupError(CLI_NOT_INSTALLED, cliInstalled));
+ return;
+ }
+
TERRAFORM_JOB_OUTPUT = new StringBuilder();
EXECUTOR_SERVICE = Executors.newSingleThreadExecutor();
TERAFORM_JOB_FUTURE = EXECUTOR_SERVICE.submit(() -> Util.F(null, x -> cloudRuntime.createCluster(setupParams, TERRAFORM_JOB_OUTPUT)));
@@ -297,7 +303,7 @@
respondWithJson(200, response, terraformJobResponse);
}
- private static void getInstallationResult(AbstractJemo jemoServer, HttpServletRequest request, HttpServletResponse response) throws ExecutionException, InterruptedException, IOException {
+ private static void getInstallationResult(AbstractJemo jemoServer, HttpServletRequest request, HttpServletResponse response) throws IOException {
TerraformJobResponse installResponse;
try {
installResponse = generateTerraformJobStatusResponse();
@@ -317,7 +323,6 @@
respondWithJson(200, response, installResponse);
}
- @NotNull
private static TerraformJobResponse generateTerraformJobStatusResponse() throws InterruptedException, ExecutionException {
if (TERAFORM_JOB_FUTURE == null) {
return new TerraformJobResponse(NOT_RUN);
@@ -431,7 +436,14 @@
}
public enum Code {
- TERRAFORM_NOT_INSTALLED, TERRAFORM_INIT_ERROR, TERRAFORM_PLAN_ERROR, TERRAFORM_APPLY_ERROR, TERRAFORM_DESTROY_ERROR, KUBECTL_NOT_INSTALLED, OTHER
+ TERRAFORM_NOT_INSTALLED,
+ TERRAFORM_INIT_ERROR,
+ TERRAFORM_PLAN_ERROR,
+ TERRAFORM_APPLY_ERROR,
+ TERRAFORM_DESTROY_ERROR,
+ KUBECTL_NOT_INSTALLED,
+ CLI_NOT_INSTALLED,
+ OTHER
}
}
diff --git a/core/src/main/java/org/eclipse/jemo/sys/internal/TerraformJob.java b/core/src/main/java/org/eclipse/jemo/sys/internal/TerraformJob.java
index d39b043..7e82235 100644
--- a/core/src/main/java/org/eclipse/jemo/sys/internal/TerraformJob.java
+++ b/core/src/main/java/org/eclipse/jemo/sys/internal/TerraformJob.java
@@ -3,13 +3,13 @@
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.eclipse.jemo.sys.JemoRuntimeSetup;
-import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Map;
+import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;
import static java.lang.Boolean.FALSE;
@@ -24,6 +24,8 @@
private final String varsFilePath;
private JemoRuntimeSetup.SetupError error;
private TerraformResult result;
+ private TimeUnit delayTimeUnit = TimeUnit.MINUTES;
+ private long delayTime = 0;
/**
* @param dirPath the directory under which the terraform templates are stored.
@@ -59,6 +61,8 @@
if (!applyResult[1].isEmpty()) {
error = new JemoRuntimeSetup.SetupError(JemoRuntimeSetup.SetupError.Code.TERRAFORM_APPLY_ERROR, applyResult[1]);
return this;
+ } else if (delayTime > 0) {
+ Util.B(null, x -> delayTimeUnit.sleep(delayTime));
}
result = TerraformResult.fromOutput(applyResult[0]);
@@ -96,7 +100,12 @@
return result;
}
- @NotNull
+ public TerraformJob withDelay(TimeUnit delayTimeUnit, long delayTime) {
+ this.delayTimeUnit = delayTimeUnit;
+ this.delayTime = delayTime;
+ return this;
+ }
+
private static String parseId(String line) {
final String startTag = "(ID: ";
final int start = line.indexOf(startTag);
diff --git a/core/src/main/java/org/eclipse/jemo/sys/internal/Util.java b/core/src/main/java/org/eclipse/jemo/sys/internal/Util.java
index 6ff1177..3cb370a 100644
--- a/core/src/main/java/org/eclipse/jemo/sys/internal/Util.java
+++ b/core/src/main/java/org/eclipse/jemo/sys/internal/Util.java
@@ -27,8 +27,6 @@
import io.kubernetes.client.apis.CoreV1Api;
import io.kubernetes.client.models.V1LoadBalancerIngress;
import io.kubernetes.client.models.V1Service;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
import java.io.*;
import java.lang.reflect.Field;
@@ -358,13 +356,13 @@
}
/**
- * Checks if the "kubectl" command is in the path
+ * Checks if the specified command is in the path
*
- * @return true if "kubectl" command is in the path, false otherwise
+ * @return true if the specified command is in the path, false otherwise
*/
- public static boolean isKubectlInstalled() {
+ public static boolean isCommandInstalled(String command) {
try {
- runProcess(null, "kubectl --help");
+ runProcess(null, command);
return true;
} catch (IOException e) {
return false;
@@ -423,7 +421,6 @@
return readParameterFromJvmOrEnv(name, null);
}
- @NotNull
public static String getLoadBalancerUrl(CoreV1Api coreV1Api) throws ApiException {
long start = System.currentTimeMillis();
long duration;
@@ -442,7 +439,6 @@
return ingresses == null || (ingresses.get(0).getHostname() == null && ingresses.get(0).getIp() == null);
}
- @NotNull
private static String[] waitAndMonitorProcess(StringBuilder builder, Process process) throws IOException {
final StringBuilder output = new StringBuilder();
final StringBuilder error = new StringBuilder();
@@ -483,7 +479,6 @@
*
* @return the properties object
*/
- @Nullable
public static Properties readPropertiesFile() {
if (!Files.exists(propertiesFilePath())) {
return null;
@@ -504,7 +499,6 @@
*
* @param properties the properties object to store
*/
- @Nullable
public static void storePropertiesFile(Properties properties) {
try {
properties.store(new FileOutputStream(propertiesFilePath().toString()), null);
@@ -517,6 +511,21 @@
return Paths.get(System.getProperty("user.home")).resolve("jemo.properties");
}
+ /**
+ * Adds or updates a property in the jemo.properties file
+ *
+ * @param key the property key
+ * @param value the property value
+ */
+ public static void addJemoProperty(String key, String value) {
+ Properties propertiesFromFile = readPropertiesFile();
+ if (propertiesFromFile == null) {
+ propertiesFromFile = new Properties();
+ }
+ propertiesFromFile.setProperty(key, value);
+ storePropertiesFile(propertiesFromFile);
+ }
+
public static byte[] readAllBytes(InputStream inputStream) throws IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
@@ -526,4 +535,23 @@
}
return buffer.toByteArray();
}
+
+ /**
+ * Attempts to read a property set as JVM parameter or environmental variable.
+ * If not found, it looks at the specified properties object and if not found it returns the specified default value.
+ *
+ * @param propertyName the property name
+ * @param properties the properties map
+ * @param defaultValue the default value to be return if the property is not found anywhere
+ * @return the property value
+ */
+ public static String readProperty(String propertyName, Properties properties, String defaultValue) {
+ final String value = readParameterFromJvmOrEnv(propertyName);
+ if (value != null) {
+ return value;
+ }
+
+ return properties == null || properties.getProperty(propertyName) == null ? defaultValue : properties.getProperty(propertyName);
+ }
+
}
diff --git a/core/src/main/resources/aws/cluster/kubernetes/jemo-statefulset.yaml b/core/src/main/resources/aws/cluster/kubernetes/jemo-statefulset.yaml
index 7b1a5c3..5067101 100644
--- a/core/src/main/resources/aws/cluster/kubernetes/jemo-statefulset.yaml
+++ b/core/src/main/resources/aws/cluster/kubernetes/jemo-statefulset.yaml
@@ -15,9 +15,9 @@
spec:
containers:
- name: jemo
- image: eclipse/jemo:1.0.2
+ image: eclipse/jemo:1.0.3
env:
- - name: eclipse.jemo.csp.region
+ - name: eclipse.jemo.aws.region
value: "_REGION_"
- name: eclipse.jemo.cloud
value: "AWS"
diff --git a/core/src/main/resources/gcp/cluster/README.txt b/core/src/main/resources/gcp/cluster/README.txt
new file mode 100644
index 0000000..5a69c93
--- /dev/null
+++ b/core/src/main/resources/gcp/cluster/README.txt
@@ -0,0 +1,23 @@
+1. Create the cluster:
+ terraform init
+ terraform plan
+ terraform apply
+
+2. Allow kubectl to communicate with the cluster:
+ gcloud container clusters get-credentials jemo-cluster
+
+3. Instantiate the jemo pods and load balancer service:
+ kubectl create -f kubernetes/credentials.yaml
+ kubectl create -f kubernetes/jemo-statefulset.yaml
+ kubectl rollout status statefulset jemo
+ kubectl create -f kubernetes/jemo-svc.yaml
+
+5. Find the hostname where jemo runs (you may need to wait 1-2 minutes to see the page loaded):
+ kubectl get svc jemo -o=jsonpath='{.status.loadBalancer.ingress[0].ip}' -w
+
+To delete everything, run:
+ kubectl delete secret jemo-user-cred
+ kubectl delete statefulset jemo
+ kubectl delete svc jemo
+ terraform destroy
+
diff --git a/core/src/main/resources/gcp/cluster/cluster.tf b/core/src/main/resources/gcp/cluster/cluster.tf
new file mode 100644
index 0000000..9f105ef
--- /dev/null
+++ b/core/src/main/resources/gcp/cluster/cluster.tf
@@ -0,0 +1,63 @@
+provider "google" {
+ version = "2.6"
+ credentials = "${file(var.credentials_file)}"
+ region = "${var.region}"
+}
+
+resource "google_container_cluster" "jemo-cluster" {
+ name = "${var.cluster_name}"
+ location = "${var.region}"
+ initial_node_count = "${var.gcp_cluster_count}"
+ project = "${var.project_id}"
+
+ master_auth {
+ username = ""
+ password = ""
+ }
+
+ node_config {
+ oauth_scopes = [
+ "https://www.googleapis.com/auth/cloud-platform"
+ ]
+
+ metadata {
+ disable-legacy-endpoints = "true"
+ }
+
+ labels = {
+ foo = "bar"
+ }
+
+ tags = [
+ "foo",
+ "bar"]
+ }
+
+ timeouts {
+ create = "30m"
+ update = "40m"
+ }
+
+}
+
+
+output "client_certificate" {
+ value = "${google_container_cluster.jemo-cluster.master_auth.0.client_certificate}"
+}
+
+output "client_key" {
+ value = "${google_container_cluster.jemo-cluster.master_auth.0.client_key}"
+}
+
+output "cluster_ca_certificate" {
+ value = "${google_container_cluster.jemo-cluster.master_auth.0.cluster_ca_certificate}"
+}
+
+
+output "gcp_cluster_endpoint" {
+ value = "${google_container_cluster.jemo-cluster.endpoint}"
+}
+
+output "gcp_cluster_name" {
+ value = "${google_container_cluster.jemo-cluster.name}"
+}
diff --git a/core/src/main/resources/gcp/cluster/kubernetes/credentials.yaml b/core/src/main/resources/gcp/cluster/kubernetes/credentials.yaml
new file mode 100644
index 0000000..c8bf8ce
--- /dev/null
+++ b/core/src/main/resources/gcp/cluster/kubernetes/credentials.yaml
@@ -0,0 +1,7 @@
+apiVersion: v1
+kind: Secret
+metadata:
+ name: jemo-user-cred
+type: Opaque
+data:
+ sa_json: _JEMO_USER_CRED_
diff --git a/core/src/main/resources/gcp/cluster/kubernetes/jemo-statefulset.yaml b/core/src/main/resources/gcp/cluster/kubernetes/jemo-statefulset.yaml
new file mode 100644
index 0000000..80d06ba
--- /dev/null
+++ b/core/src/main/resources/gcp/cluster/kubernetes/jemo-statefulset.yaml
@@ -0,0 +1,43 @@
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ name: jemo
+spec:
+ selector:
+ matchLabels:
+ app: jemo
+ serviceName: "jemo"
+ replicas: _JEMO_REPLICAS_
+ template:
+ metadata:
+ labels:
+ app: jemo
+ spec:
+ containers:
+ - name: jemo
+ volumeMounts:
+ - name: service-account-credentials-volume
+ mountPath: /etc/gcp
+ readOnly: true
+ image: eclipse/jemo:1.0.3
+ imagePullPolicy: Always
+ env:
+ - name: eclipse.jemo.gcp.region
+ value: "_REGION_"
+ - name: eclipse.jemo.cloud
+ value: "GCP"
+ - name: eclipse.jemo.http.port
+ value: "80"
+ - name: eclipse.jemo.https.port
+ value: "443"
+ - name: GOOGLE_APPLICATION_CREDENTIALS
+ value: /etc/gcp/sa_credentials.json
+ ports:
+ - containerPort: 80
+ volumes:
+ - name: service-account-credentials-volume
+ secret:
+ secretName: jemo-user-cred
+ items:
+ - key: sa_json
+ path: sa_credentials.json
\ No newline at end of file
diff --git a/core/src/main/resources/gcp/cluster/kubernetes/jemo-svc.yaml b/core/src/main/resources/gcp/cluster/kubernetes/jemo-svc.yaml
new file mode 100644
index 0000000..3e6db4e
--- /dev/null
+++ b/core/src/main/resources/gcp/cluster/kubernetes/jemo-svc.yaml
@@ -0,0 +1,17 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: jemo
+ labels:
+ app: jemo
+spec:
+ ports:
+ - name: http
+ port: 80
+ protocol: TCP
+ - name: https
+ port: 443
+ protocol: TCP
+ selector:
+ app: jemo
+ type: LoadBalancer
diff --git a/core/src/main/resources/gcp/cluster/variables.tf b/core/src/main/resources/gcp/cluster/variables.tf
new file mode 100644
index 0000000..7332834
--- /dev/null
+++ b/core/src/main/resources/gcp/cluster/variables.tf
@@ -0,0 +1,27 @@
+variable "region" {
+ description = "The GCP region."
+ type = "string"
+}
+
+variable "credentials_file" {
+ description = "The credentials file."
+ type = "string"
+}
+
+variable "project_id" {
+ description = "The project id."
+ type = "string"
+}
+
+// GCP Variables
+variable "gcp_cluster_count" {
+ description = "Count of cluster instances to start."
+ type = "string"
+}
+
+variable "cluster_name" {
+ description = "Cluster name for the GCP Cluster."
+ type = "string"
+}
+
+
diff --git a/core/src/main/resources/gcp/install/install.tf b/core/src/main/resources/gcp/install/install.tf
new file mode 100644
index 0000000..f82741e
--- /dev/null
+++ b/core/src/main/resources/gcp/install/install.tf
@@ -0,0 +1,117 @@
+provider "google" {
+ version = "2.6"
+ credentials = "${file("${var.credentials_file}")}"
+ project = "${var.project_id}"
+ region = "${var.region}"
+}
+
+resource "google_service_account" "user" {
+ account_id = "jemo-user"
+ display_name = "Jemo User"
+ project = "${var.project_id}"
+}
+
+resource "google_project_iam_custom_role" "jemo-role" {
+ role_id = "jemoRole"
+ title = "Jemo Role"
+ description = "Permissions needed to run Jemo"
+ permissions = ["iam.serviceAccounts.get", "resourcemanager.projects.getIamPolicy"]
+ project = "${var.project_id}"
+}
+
+resource "null_resource" "delay" {
+ provisioner "local-exec" {
+ command = "sleep 60"
+ }
+ triggers = {
+ "before" = "${google_project_service.cloudresourcemanager.id}"
+ }
+}
+
+resource "google_project_iam_binding" "jemo-role-binding" {
+ project = "${var.project_id}"
+ role = "${google_project_iam_custom_role.jemo-role.id}"
+
+ members = [
+ "serviceAccount:${google_service_account.user.email}"
+ ]
+
+ depends_on = ["null_resource.delay"]
+}
+
+resource "google_project_iam_binding" "datastore-role" {
+ project = "${var.project_id}"
+ role = "roles/datastore.user"
+
+ members = [
+ "serviceAccount:${google_service_account.user.email}"
+ ]
+
+ depends_on = ["null_resource.delay"]
+}
+
+resource "google_project_iam_binding" "storage-role" {
+ project = "${var.project_id}"
+ role = "roles/storage.admin"
+
+ members = [
+ "serviceAccount:${google_service_account.user.email}"
+ ]
+
+ depends_on = ["null_resource.delay"]
+}
+
+resource "google_project_iam_binding" "logging-role" {
+ project = "${var.project_id}"
+ role = "roles/logging.admin"
+
+ members = [
+ "serviceAccount:${google_service_account.user.email}"
+ ]
+
+ depends_on = ["null_resource.delay"]
+}
+
+resource "google_service_account_key" "key" {
+ service_account_id = "${google_service_account.user.id}"
+ public_key_type = "TYPE_X509_PEM_FILE"
+}
+
+resource "local_file" "myaccountjson" {
+ content = "${base64decode(google_service_account_key.key.private_key)}"
+ filename = "${path.module}/jemo-user@${var.project_id}-cred.json"
+}
+
+resource "google_project_service" "cloudresourcemanager" {
+ project = "${var.project_id}"
+ service = "cloudresourcemanager.googleapis.com"
+ disable_on_destroy = false
+}
+
+resource "google_project_service" "datastore" {
+ project = "${var.project_id}"
+ service = "datastore.googleapis.com"
+ disable_on_destroy = false
+}
+
+resource "google_project_service" "storage" {
+ project = "${var.project_id}"
+ service = "storage-api.googleapis.com"
+ disable_on_destroy = false
+}
+
+resource "google_project_service" "container" {
+ project = "${var.project_id}"
+ service = "container.googleapis.com"
+ disable_on_destroy = false
+}
+
+resource "google_project_service" "logging" {
+ project = "${var.project_id}"
+ service = "logging.googleapis.com"
+ disable_on_destroy = false
+}
+
+output "user_account_id" {
+ value = "${google_service_account.user.account_id}"
+}
diff --git a/core/src/main/resources/gcp/install/variables.tf b/core/src/main/resources/gcp/install/variables.tf
new file mode 100644
index 0000000..eb2c6be
--- /dev/null
+++ b/core/src/main/resources/gcp/install/variables.tf
@@ -0,0 +1,15 @@
+variable "region" {
+ description = "The GCP region."
+ type = "string"
+}
+
+variable "credentials_file" {
+ description = "The terraform-user credentials file."
+ type = "string"
+}
+
+variable "project_id" {
+ description = "The project id."
+ type = "string"
+}
+
diff --git a/core/src/main/resources/runtime-jars/azure-runtime.jar b/core/src/main/resources/runtime-jars/azure-runtime.jar
index 97028e2..fd42229 100644
--- a/core/src/main/resources/runtime-jars/azure-runtime.jar
+++ b/core/src/main/resources/runtime-jars/azure-runtime.jar
Binary files differ
diff --git a/core/src/main/resources/setup/index.html b/core/src/main/resources/setup/index.html
index d5a110f..a30d501 100644
--- a/core/src/main/resources/setup/index.html
+++ b/core/src/main/resources/setup/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/jemo/setup/favicon.ico><title>eclipse-jemo-setup-ui</title><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900"><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Material+Icons"><link href=/jemo/setup/css/chunk-03cdf7e9.a3bec636.css rel=prefetch><link href=/jemo/setup/css/chunk-06393579.271b7aec.css rel=prefetch><link href=/jemo/setup/css/chunk-0fad73e8.b29c19a2.css rel=prefetch><link href=/jemo/setup/css/chunk-24485444.3b67e5f7.css rel=prefetch><link href=/jemo/setup/css/chunk-9230b392.2bc6ec50.css rel=prefetch><link href=/jemo/setup/css/chunk-975357a2.3367c996.css rel=prefetch><link href=/jemo/setup/css/chunk-c2759cc8.3ffd3865.css rel=prefetch><link href=/jemo/setup/css/chunk-f0297e60.b29c19a2.css rel=prefetch><link href=/jemo/setup/js/chunk-03cdf7e9.b78159a4.js rel=prefetch><link href=/jemo/setup/js/chunk-06393579.58277927.js rel=prefetch><link href=/jemo/setup/js/chunk-0fad73e8.70ad8c4d.js rel=prefetch><link href=/jemo/setup/js/chunk-24485444.d8d0af6c.js rel=prefetch><link href=/jemo/setup/js/chunk-2d0ac25c.232aea9a.js rel=prefetch><link href=/jemo/setup/js/chunk-2d0e5f4f.8b281001.js rel=prefetch><link href=/jemo/setup/js/chunk-2d216bc4.2370be33.js rel=prefetch><link href=/jemo/setup/js/chunk-711cdce4.6d07f284.js rel=prefetch><link href=/jemo/setup/js/chunk-9230b392.0d33c639.js rel=prefetch><link href=/jemo/setup/js/chunk-975357a2.f01b5bb0.js rel=prefetch><link href=/jemo/setup/js/chunk-c2759cc8.a0a44058.js rel=prefetch><link href=/jemo/setup/js/chunk-f0297e60.4aea2ebb.js rel=prefetch><link href=/jemo/setup/css/chunk-vendors.83ffa810.css rel=preload as=style><link href=/jemo/setup/js/app.f7576136.js rel=preload as=script><link href=/jemo/setup/js/chunk-vendors.9adc35b5.js rel=preload as=script><link href=/jemo/setup/css/chunk-vendors.83ffa810.css rel=stylesheet></head><body><noscript><strong>We're sorry but eclipse-jemo-setup-ui doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/jemo/setup/js/chunk-vendors.9adc35b5.js></script><script src=/jemo/setup/js/app.f7576136.js></script></body></html>
\ No newline at end of file
+<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/jemo/setup/favicon.ico><title>eclipse-jemo-setup-ui</title><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900"><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Material+Icons"><link href=/jemo/setup/css/chunk-03cdf7e9.a3bec636.css rel=prefetch><link href=/jemo/setup/css/chunk-06393579.271b7aec.css rel=prefetch><link href=/jemo/setup/css/chunk-0fad73e8.b29c19a2.css rel=prefetch><link href=/jemo/setup/css/chunk-24485444.3b67e5f7.css rel=prefetch><link href=/jemo/setup/css/chunk-9230b392.2bc6ec50.css rel=prefetch><link href=/jemo/setup/css/chunk-975357a2.3367c996.css rel=prefetch><link href=/jemo/setup/css/chunk-c2759cc8.3ffd3865.css rel=prefetch><link href=/jemo/setup/css/chunk-f0297e60.b29c19a2.css rel=prefetch><link href=/jemo/setup/js/chunk-03cdf7e9.b78159a4.js rel=prefetch><link href=/jemo/setup/js/chunk-06393579.58277927.js rel=prefetch><link href=/jemo/setup/js/chunk-0fad73e8.70ad8c4d.js rel=prefetch><link href=/jemo/setup/js/chunk-24485444.d8d0af6c.js rel=prefetch><link href=/jemo/setup/js/chunk-2d0ac25c.232aea9a.js rel=prefetch><link href=/jemo/setup/js/chunk-2d0e5f4f.8b281001.js rel=prefetch><link href=/jemo/setup/js/chunk-2d216bc4.d0c185c1.js rel=prefetch><link href=/jemo/setup/js/chunk-711cdce4.6d07f284.js rel=prefetch><link href=/jemo/setup/js/chunk-9230b392.0d33c639.js rel=prefetch><link href=/jemo/setup/js/chunk-975357a2.a9960b1d.js rel=prefetch><link href=/jemo/setup/js/chunk-c2759cc8.a0a44058.js rel=prefetch><link href=/jemo/setup/js/chunk-f0297e60.4aea2ebb.js rel=prefetch><link href=/jemo/setup/css/chunk-vendors.83ffa810.css rel=preload as=style><link href=/jemo/setup/js/app.2510375b.js rel=preload as=script><link href=/jemo/setup/js/chunk-vendors.9adc35b5.js rel=preload as=script><link href=/jemo/setup/css/chunk-vendors.83ffa810.css rel=stylesheet></head><body><noscript><strong>We're sorry but eclipse-jemo-setup-ui doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/jemo/setup/js/chunk-vendors.9adc35b5.js></script><script src=/jemo/setup/js/app.2510375b.js></script></body></html>
\ No newline at end of file
diff --git a/core/src/main/resources/setup/js/app.f7576136.js b/core/src/main/resources/setup/js/app.2510375b.js
similarity index 96%
rename from core/src/main/resources/setup/js/app.f7576136.js
rename to core/src/main/resources/setup/js/app.2510375b.js
index 701ade9..71017a9 100644
--- a/core/src/main/resources/setup/js/app.f7576136.js
+++ b/core/src/main/resources/setup/js/app.2510375b.js
@@ -1,2 +1,2 @@
-(function(e){function t(t){for(var r,a,u=t[0],s=t[1],l=t[2],i=0,p=[];i<u.length;i++)a=u[i],c[a]&&p.push(c[a][0]),c[a]=0;for(r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r]);f&&f(t);while(p.length)p.shift()();return o.push.apply(o,l||[]),n()}function n(){for(var e,t=0;t<o.length;t++){for(var n=o[t],r=!0,a=1;a<n.length;a++){var u=n[a];0!==c[u]&&(r=!1)}r&&(o.splice(t--,1),e=s(s.s=n[0]))}return e}var r={},a={app:0},c={app:0},o=[];function u(e){return s.p+"js/"+({}[e]||e)+"."+{"chunk-03cdf7e9":"b78159a4","chunk-06393579":"58277927","chunk-0fad73e8":"70ad8c4d","chunk-24485444":"d8d0af6c","chunk-975357a2":"f01b5bb0","chunk-c2759cc8":"a0a44058","chunk-2d0e5f4f":"8b281001","chunk-2d216bc4":"2370be33","chunk-f0297e60":"4aea2ebb","chunk-2d0ac25c":"232aea9a","chunk-711cdce4":"6d07f284","chunk-9230b392":"0d33c639"}[e]+".js"}function s(t){if(r[t])return r[t].exports;var n=r[t]={i:t,l:!1,exports:{}};return e[t].call(n.exports,n,n.exports,s),n.l=!0,n.exports}s.e=function(e){var t=[],n={"chunk-03cdf7e9":1,"chunk-06393579":1,"chunk-0fad73e8":1,"chunk-24485444":1,"chunk-975357a2":1,"chunk-c2759cc8":1,"chunk-f0297e60":1,"chunk-9230b392":1};a[e]?t.push(a[e]):0!==a[e]&&n[e]&&t.push(a[e]=new Promise(function(t,n){for(var r="css/"+({}[e]||e)+"."+{"chunk-03cdf7e9":"a3bec636","chunk-06393579":"271b7aec","chunk-0fad73e8":"b29c19a2","chunk-24485444":"3b67e5f7","chunk-975357a2":"3367c996","chunk-c2759cc8":"3ffd3865","chunk-2d0e5f4f":"31d6cfe0","chunk-2d216bc4":"31d6cfe0","chunk-f0297e60":"b29c19a2","chunk-2d0ac25c":"31d6cfe0","chunk-711cdce4":"31d6cfe0","chunk-9230b392":"2bc6ec50"}[e]+".css",c=s.p+r,o=document.getElementsByTagName("link"),u=0;u<o.length;u++){var l=o[u],i=l.getAttribute("data-href")||l.getAttribute("href");if("stylesheet"===l.rel&&(i===r||i===c))return t()}var p=document.getElementsByTagName("style");for(u=0;u<p.length;u++){l=p[u],i=l.getAttribute("data-href");if(i===r||i===c)return t()}var f=document.createElement("link");f.rel="stylesheet",f.type="text/css",f.onload=t,f.onerror=function(t){var r=t&&t.target&&t.target.src||c,o=new Error("Loading CSS chunk "+e+" failed.\n("+r+")");o.request=r,delete a[e],f.parentNode.removeChild(f),n(o)},f.href=c;var d=document.getElementsByTagName("head")[0];d.appendChild(f)}).then(function(){a[e]=0}));var r=c[e];if(0!==r)if(r)t.push(r[2]);else{var o=new Promise(function(t,n){r=c[e]=[t,n]});t.push(r[2]=o);var l,i=document.createElement("script");i.charset="utf-8",i.timeout=120,s.nc&&i.setAttribute("nonce",s.nc),i.src=u(e),l=function(t){i.onerror=i.onload=null,clearTimeout(p);var n=c[e];if(0!==n){if(n){var r=t&&("load"===t.type?"missing":t.type),a=t&&t.target&&t.target.src,o=new Error("Loading chunk "+e+" failed.\n("+r+": "+a+")");o.type=r,o.request=a,n[1](o)}c[e]=void 0}};var p=setTimeout(function(){l({type:"timeout",target:i})},12e4);i.onerror=i.onload=l,document.head.appendChild(i)}return Promise.all(t)},s.m=e,s.c=r,s.d=function(e,t,n){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},s.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(s.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)s.d(n,r,function(t){return e[t]}.bind(null,r));return n},s.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="/jemo/setup/",s.oe=function(e){throw console.error(e),e};var l=window["webpackJsonp"]=window["webpackJsonp"]||[],i=l.push.bind(l);l.push=t,l=l.slice();for(var p=0;p<l.length;p++)t(l[p]);var f=i;o.push([0,"chunk-vendors"]),n()})({0:function(e,t,n){e.exports=n("56d7")},1:function(e,t){},"56d7":function(e,t,n){"use strict";n.r(t);n("cadf"),n("551c"),n("097d");var r=n("2b0e"),a=n("28dd"),c=n("bb71");n("da64");r["a"].use(c["a"],{iconfont:"md"});var o=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-app",[n("navbar"),n("v-content",{staticClass:"mx-4 mb-4"},[n("keep-alive",[n("router-view")],1)],1)],1)},u=[],s=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-toolbar",{staticClass:"indigo",attrs:{app:"",dark:""}},[n("v-toolbar-title",{staticClass:"headline text-uppercase"},[n("span",[e._v("Eclipse Jemo")]),n("span",{staticClass:"font-weight-light mx-2"},[e._v("Setup UI")])]),n("v-spacer"),n("v-btn",{attrs:{flat:"",href:"https://www.eclipse.org/jemo/",target:"_blank"}},[n("span",{staticClass:"mr-8"},[e._v("Project page")])])],1)},l=[],i={},p=i,f=n("2877"),d=n("6544"),h=n.n(d),m=n("8336"),b=n("9910"),v=n("71d9"),k=n("2a7f"),g=Object(f["a"])(p,s,l,!1,null,null,null);g.options.__file="Navbar.vue";var y=g.exports;h()(g,{VBtn:m["a"],VSpacer:b["a"],VToolbar:v["a"],VToolbarTitle:k["a"]});var _={name:"App",components:{Navbar:y},data:function(){return{}}},j=_,w=n("7496"),C=n("549c"),P=Object(f["a"])(j,o,u,!1,null,null,null);P.options.__file="App.vue";var x=P.exports;h()(P,{VApp:w["a"],VContent:C["a"]});var S=n("8c4f"),T=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"home"},[n("v-container",{attrs:{"grid-list-md":""}},[n("v-layout",{attrs:{row:"",wrap:""}},e._l(e.supportedCSPs,function(t){return n("v-flex",{key:t.name,attrs:{xs12:"",sm6:"",md4:"",lg3:""}},[n("v-card",{staticClass:"text-xs-center ma-3",staticStyle:{cursor:"pointer"},attrs:{flat:""},on:{click:function(n){e.onCspSelected(t)}}},[n("v-card-title",{staticClass:"justify-center",attrs:{"primary-title":""}},[n("h3",{staticClass:"headline justify-center mb-0"},[e._v(e._s(t.name))])]),n("v-card-text",[t.url?n("a",{attrs:{href:t.url,target:"_blank"}},[e._v(e._s(t.description))]):n("div",[e._v(e._s(t.description))])])],1)],1)}),1)],1)],1)},O=[],E=(n("7f7f"),{data:function(){return{supportedCSPs:[]}},created:function(){var e=this;this.$http.get("init").then(function(t){console.log(t),e.supportedCSPs=t.data},function(e){console.log(e)})},methods:{onCspSelected:function(e){var t=this,n={csp:e.name};this.$http.put("csp/"+e.name,n).then(function(n){console.log(n),"MEMORY"===e.name?t.redirectToParamSet(e):t.$router.push({name:"csp",params:{csp:e}})},function(e){console.log(e),alert(e.data)})},redirectToParamSet:function(e){var t=this;this.$http.get("jemoparams/paramsets/"+e.name).then(function(n){console.log(n),t.$router.push({name:"jemo-param-set",params:{csp:e,paramSets:n.data}})},function(e){console.log(e),alert(e.data)})}}}),V=E,$=n("b0af"),A=n("99d9"),M=n("12b2"),N=n("a523"),B=n("0e8f"),J=n("a722"),L=Object(f["a"])(V,T,O,!1,null,null,null);L.options.__file="Home.vue";var q=L.exports;h()(L,{VCard:$["a"],VCardText:A["b"],VCardTitle:M["a"],VContainer:N["a"],VFlex:B["a"],VLayout:J["a"]}),r["a"].use(S["a"]);var F=new S["a"]({routes:[{path:"/",name:"home",component:q},{path:"/csp",name:"csp",props:!0,component:function(){return n.e("chunk-2d0ac25c").then(n.bind(null,"17ff"))}},{path:"/delete",name:"delete",props:!0,component:function(){return n.e("chunk-9230b392").then(n.bind(null,"0818"))}},{path:"/csp-cred",name:"csp-cred",props:!0,component:function(){return Promise.all([n.e("chunk-03cdf7e9"),n.e("chunk-24485444")]).then(n.bind(null,"5b37"))}},{path:"/install/props",name:"install-props",props:!0,component:function(){return Promise.all([n.e("chunk-03cdf7e9"),n.e("chunk-f0297e60")]).then(n.bind(null,"6ab2"))}},{path:"/install",name:"install",props:!0,component:function(){return Promise.all([n.e("chunk-03cdf7e9"),n.e("chunk-c2759cc8"),n.e("chunk-2d0e5f4f")]).then(n.bind(null,"9761"))}},{path:"/jemo/param-set",name:"jemo-param-set",props:!0,component:function(){return Promise.all([n.e("chunk-03cdf7e9"),n.e("chunk-0fad73e8")]).then(n.bind(null,"cdc1"))}},{path:"/jemo/params",name:"jemo-params",props:!0,component:function(){return Promise.all([n.e("chunk-03cdf7e9"),n.e("chunk-06393579")]).then(n.bind(null,"c813"))}},{path:"/jemo/setup-complete",name:"setup-complete",props:!0,component:function(){return n.e("chunk-711cdce4").then(n.bind(null,"8c91"))}},{path:"/prod/config",name:"prod-conf",props:!0,component:function(){return Promise.all([n.e("chunk-03cdf7e9"),n.e("chunk-975357a2")]).then(n.bind(null,"f4c7"))}},{path:"/cluster/create",name:"create-cluster",props:!0,component:function(){return Promise.all([n.e("chunk-03cdf7e9"),n.e("chunk-c2759cc8"),n.e("chunk-2d216bc4")]).then(n.bind(null,"c474"))}},{path:"*",redirect:{name:"home"}}]});r["a"].config.productionTip=!1,r["a"].use(a["a"]),r["a"].http.options.root="/jemo/setup",new r["a"]({router:F,render:function(e){return e(x)}}).$mount("#app")}});
-//# sourceMappingURL=app.f7576136.js.map
\ No newline at end of file
+(function(e){function t(t){for(var r,a,u=t[0],s=t[1],l=t[2],i=0,p=[];i<u.length;i++)a=u[i],c[a]&&p.push(c[a][0]),c[a]=0;for(r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r]);f&&f(t);while(p.length)p.shift()();return o.push.apply(o,l||[]),n()}function n(){for(var e,t=0;t<o.length;t++){for(var n=o[t],r=!0,a=1;a<n.length;a++){var u=n[a];0!==c[u]&&(r=!1)}r&&(o.splice(t--,1),e=s(s.s=n[0]))}return e}var r={},a={app:0},c={app:0},o=[];function u(e){return s.p+"js/"+({}[e]||e)+"."+{"chunk-03cdf7e9":"b78159a4","chunk-06393579":"58277927","chunk-0fad73e8":"70ad8c4d","chunk-24485444":"d8d0af6c","chunk-975357a2":"a9960b1d","chunk-c2759cc8":"a0a44058","chunk-2d0e5f4f":"8b281001","chunk-2d216bc4":"d0c185c1","chunk-f0297e60":"4aea2ebb","chunk-2d0ac25c":"232aea9a","chunk-711cdce4":"6d07f284","chunk-9230b392":"0d33c639"}[e]+".js"}function s(t){if(r[t])return r[t].exports;var n=r[t]={i:t,l:!1,exports:{}};return e[t].call(n.exports,n,n.exports,s),n.l=!0,n.exports}s.e=function(e){var t=[],n={"chunk-03cdf7e9":1,"chunk-06393579":1,"chunk-0fad73e8":1,"chunk-24485444":1,"chunk-975357a2":1,"chunk-c2759cc8":1,"chunk-f0297e60":1,"chunk-9230b392":1};a[e]?t.push(a[e]):0!==a[e]&&n[e]&&t.push(a[e]=new Promise(function(t,n){for(var r="css/"+({}[e]||e)+"."+{"chunk-03cdf7e9":"a3bec636","chunk-06393579":"271b7aec","chunk-0fad73e8":"b29c19a2","chunk-24485444":"3b67e5f7","chunk-975357a2":"3367c996","chunk-c2759cc8":"3ffd3865","chunk-2d0e5f4f":"31d6cfe0","chunk-2d216bc4":"31d6cfe0","chunk-f0297e60":"b29c19a2","chunk-2d0ac25c":"31d6cfe0","chunk-711cdce4":"31d6cfe0","chunk-9230b392":"2bc6ec50"}[e]+".css",c=s.p+r,o=document.getElementsByTagName("link"),u=0;u<o.length;u++){var l=o[u],i=l.getAttribute("data-href")||l.getAttribute("href");if("stylesheet"===l.rel&&(i===r||i===c))return t()}var p=document.getElementsByTagName("style");for(u=0;u<p.length;u++){l=p[u],i=l.getAttribute("data-href");if(i===r||i===c)return t()}var f=document.createElement("link");f.rel="stylesheet",f.type="text/css",f.onload=t,f.onerror=function(t){var r=t&&t.target&&t.target.src||c,o=new Error("Loading CSS chunk "+e+" failed.\n("+r+")");o.request=r,delete a[e],f.parentNode.removeChild(f),n(o)},f.href=c;var d=document.getElementsByTagName("head")[0];d.appendChild(f)}).then(function(){a[e]=0}));var r=c[e];if(0!==r)if(r)t.push(r[2]);else{var o=new Promise(function(t,n){r=c[e]=[t,n]});t.push(r[2]=o);var l,i=document.createElement("script");i.charset="utf-8",i.timeout=120,s.nc&&i.setAttribute("nonce",s.nc),i.src=u(e),l=function(t){i.onerror=i.onload=null,clearTimeout(p);var n=c[e];if(0!==n){if(n){var r=t&&("load"===t.type?"missing":t.type),a=t&&t.target&&t.target.src,o=new Error("Loading chunk "+e+" failed.\n("+r+": "+a+")");o.type=r,o.request=a,n[1](o)}c[e]=void 0}};var p=setTimeout(function(){l({type:"timeout",target:i})},12e4);i.onerror=i.onload=l,document.head.appendChild(i)}return Promise.all(t)},s.m=e,s.c=r,s.d=function(e,t,n){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},s.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(s.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)s.d(n,r,function(t){return e[t]}.bind(null,r));return n},s.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="/jemo/setup/",s.oe=function(e){throw console.error(e),e};var l=window["webpackJsonp"]=window["webpackJsonp"]||[],i=l.push.bind(l);l.push=t,l=l.slice();for(var p=0;p<l.length;p++)t(l[p]);var f=i;o.push([0,"chunk-vendors"]),n()})({0:function(e,t,n){e.exports=n("56d7")},1:function(e,t){},"56d7":function(e,t,n){"use strict";n.r(t);n("cadf"),n("551c"),n("097d");var r=n("2b0e"),a=n("28dd"),c=n("bb71");n("da64");r["a"].use(c["a"],{iconfont:"md"});var o=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-app",[n("navbar"),n("v-content",{staticClass:"mx-4 mb-4"},[n("keep-alive",[n("router-view")],1)],1)],1)},u=[],s=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-toolbar",{staticClass:"indigo",attrs:{app:"",dark:""}},[n("v-toolbar-title",{staticClass:"headline text-uppercase"},[n("span",[e._v("Eclipse Jemo")]),n("span",{staticClass:"font-weight-light mx-2"},[e._v("Setup UI")])]),n("v-spacer"),n("v-btn",{attrs:{flat:"",href:"https://www.eclipse.org/jemo/",target:"_blank"}},[n("span",{staticClass:"mr-8"},[e._v("Project page")])])],1)},l=[],i={},p=i,f=n("2877"),d=n("6544"),h=n.n(d),m=n("8336"),v=n("9910"),b=n("71d9"),k=n("2a7f"),g=Object(f["a"])(p,s,l,!1,null,null,null);g.options.__file="Navbar.vue";var y=g.exports;h()(g,{VBtn:m["a"],VSpacer:v["a"],VToolbar:b["a"],VToolbarTitle:k["a"]});var _={name:"App",components:{Navbar:y},data:function(){return{}}},j=_,w=n("7496"),C=n("549c"),P=Object(f["a"])(j,o,u,!1,null,null,null);P.options.__file="App.vue";var x=P.exports;h()(P,{VApp:w["a"],VContent:C["a"]});var S=n("8c4f"),T=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"home"},[n("v-container",{attrs:{"grid-list-md":""}},[n("v-layout",{attrs:{row:"",wrap:""}},e._l(e.supportedCSPs,function(t){return n("v-flex",{key:t.name,attrs:{xs12:"",sm6:"",md4:"",lg3:""}},[n("v-card",{staticClass:"text-xs-center ma-3",staticStyle:{cursor:"pointer"},attrs:{flat:""},on:{click:function(n){e.onCspSelected(t)}}},[n("v-card-title",{staticClass:"justify-center",attrs:{"primary-title":""}},[n("h3",{staticClass:"headline justify-center mb-0"},[e._v(e._s(t.name))])]),n("v-card-text",[t.url?n("a",{attrs:{href:t.url,target:"_blank"}},[e._v(e._s(t.description))]):n("div",[e._v(e._s(t.description))])])],1)],1)}),1)],1)],1)},O=[],E=(n("7f7f"),{data:function(){return{supportedCSPs:[]}},created:function(){var e=this;this.$http.get("init").then(function(t){console.log(t),e.supportedCSPs=t.data},function(e){console.log(e)})},methods:{onCspSelected:function(e){var t=this,n={csp:e.name};this.$http.put("csp/"+e.name,n).then(function(n){console.log(n),"MEMORY"===e.name?t.redirectToParamSet(e):t.$router.push({name:"csp",params:{csp:e}})},function(e){console.log(e),alert(e.data)})},redirectToParamSet:function(e){var t=this;this.$http.get("jemoparams/paramsets/"+e.name).then(function(n){console.log(n),t.$router.push({name:"jemo-param-set",params:{csp:e,paramSets:n.data}})},function(e){console.log(e),alert(e.data)})}}}),V=E,$=n("b0af"),A=n("99d9"),M=n("12b2"),N=n("a523"),B=n("0e8f"),J=n("a722"),L=Object(f["a"])(V,T,O,!1,null,null,null);L.options.__file="Home.vue";var q=L.exports;h()(L,{VCard:$["a"],VCardText:A["b"],VCardTitle:M["a"],VContainer:N["a"],VFlex:B["a"],VLayout:J["a"]}),r["a"].use(S["a"]);var F=new S["a"]({routes:[{path:"/",name:"home",component:q},{path:"/csp",name:"csp",props:!0,component:function(){return n.e("chunk-2d0ac25c").then(n.bind(null,"17ff"))}},{path:"/delete",name:"delete",props:!0,component:function(){return n.e("chunk-9230b392").then(n.bind(null,"0818"))}},{path:"/csp-cred",name:"csp-cred",props:!0,component:function(){return Promise.all([n.e("chunk-03cdf7e9"),n.e("chunk-24485444")]).then(n.bind(null,"5b37"))}},{path:"/install/props",name:"install-props",props:!0,component:function(){return Promise.all([n.e("chunk-03cdf7e9"),n.e("chunk-f0297e60")]).then(n.bind(null,"6ab2"))}},{path:"/install",name:"install",props:!0,component:function(){return Promise.all([n.e("chunk-03cdf7e9"),n.e("chunk-c2759cc8"),n.e("chunk-2d0e5f4f")]).then(n.bind(null,"9761"))}},{path:"/jemo/param-set",name:"jemo-param-set",props:!0,component:function(){return Promise.all([n.e("chunk-03cdf7e9"),n.e("chunk-0fad73e8")]).then(n.bind(null,"cdc1"))}},{path:"/jemo/params",name:"jemo-params",props:!0,component:function(){return Promise.all([n.e("chunk-03cdf7e9"),n.e("chunk-06393579")]).then(n.bind(null,"c813"))}},{path:"/jemo/setup-complete",name:"setup-complete",props:!0,component:function(){return n.e("chunk-711cdce4").then(n.bind(null,"8c91"))}},{path:"/prod/config",name:"prod-conf",props:!0,component:function(){return Promise.all([n.e("chunk-03cdf7e9"),n.e("chunk-975357a2")]).then(n.bind(null,"f4c7"))}},{path:"/cluster/create",name:"create-cluster",props:!0,component:function(){return Promise.all([n.e("chunk-03cdf7e9"),n.e("chunk-c2759cc8"),n.e("chunk-2d216bc4")]).then(n.bind(null,"c474"))}},{path:"*",redirect:{name:"home"}}]});r["a"].config.productionTip=!1,r["a"].use(a["a"]),r["a"].http.options.root="/jemo/setup",new r["a"]({router:F,render:function(e){return e(x)}}).$mount("#app")}});
+//# sourceMappingURL=app.2510375b.js.map
\ No newline at end of file
diff --git a/core/src/main/resources/setup/js/app.f7576136.js.map b/core/src/main/resources/setup/js/app.2510375b.js.map
similarity index 99%
rename from core/src/main/resources/setup/js/app.f7576136.js.map
rename to core/src/main/resources/setup/js/app.2510375b.js.map
index 49325b4..cb9bc86 100644
--- a/core/src/main/resources/setup/js/app.f7576136.js.map
+++ b/core/src/main/resources/setup/js/app.2510375b.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/plugins/vuetify.js","webpack:///./src/App.vue?4f79","webpack:///./src/components/Navbar.vue?3908","webpack:///src/components/Navbar.vue","webpack:///./src/components/Navbar.vue?e293","webpack:///./src/components/Navbar.vue","webpack:///src/App.vue","webpack:///./src/App.vue?0bd2","webpack:///./src/App.vue","webpack:///./src/views/Home.vue?50ff","webpack:///src/views/Home.vue","webpack:///./src/views/Home.vue?f351","webpack:///./src/views/Home.vue","webpack:///./src/router.js","webpack:///./src/main.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","installedCssChunks","app","jsonpScriptSrc","p","chunk-03cdf7e9","chunk-06393579","chunk-0fad73e8","chunk-24485444","chunk-975357a2","chunk-c2759cc8","chunk-2d0e5f4f","chunk-2d216bc4","chunk-f0297e60","chunk-2d0ac25c","chunk-711cdce4","chunk-9230b392","exports","module","l","e","promises","cssChunks","Promise","resolve","reject","href","fullhref","existingLinkTags","document","getElementsByTagName","tag","dataHref","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","parentNode","removeChild","head","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","clearTimeout","chunk","errorType","realSrc","error","undefined","setTimeout","all","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","Vue","use","Vuetify","iconfont","Appvue_type_template_id_55eed8d2_render","_vm","this","_h","$createElement","_c","_self","staticClass","staticRenderFns","Navbarvue_type_template_id_adb4bf36_render","attrs","dark","_v","flat","Navbarvue_type_template_id_adb4bf36_staticRenderFns","Navbarvue_type_script_lang_js_","components_Navbarvue_type_script_lang_js_","component","componentNormalizer","options","__file","Navbar","installComponents_default","VBtn","VSpacer","VGrid","VToolbar","VToolbarTitle","components_VToolbar","Appvue_type_script_lang_js_","components","src_Appvue_type_script_lang_js_","App_component","App","VApp","VContent","Homevue_type_template_id_b86b620e_render","grid-list-md","row","wrap","_l","supportedCSP","xs12","sm6","md4","lg3","staticStyle","cursor","on","click","$event","onCspSelected","primary-title","_s","url","description","Homevue_type_template_id_b86b620e_staticRenderFns","Homevue_type_script_lang_js_","supportedCSPs","created","_this","$http","response","log","methods","csp","_this2","payload","put","redirectToParamSet","$router","params","alert","_this3","paramSets","views_Homevue_type_script_lang_js_","Home_component","Home","VCard","VCardText","components_VCard","VCardTitle","VContainer","VFlex","VLayout","Router","router","routes","path","props","redirect","config","productionTip","VueResource","http","root","render","h","$mount"],"mappings":"aACA,SAAAA,EAAAC,GAQA,IAPA,IAMAC,EAAAC,EANAC,EAAAH,EAAA,GACAI,EAAAJ,EAAA,GACAK,EAAAL,EAAA,GAIAM,EAAA,EAAAC,EAAA,GACQD,EAAAH,EAAAK,OAAoBF,IAC5BJ,EAAAC,EAAAG,GACAG,EAAAP,IACAK,EAAAG,KAAAD,EAAAP,GAAA,IAEAO,EAAAP,GAAA,EAEA,IAAAD,KAAAG,EACAO,OAAAC,UAAAC,eAAAC,KAAAV,EAAAH,KACAc,EAAAd,GAAAG,EAAAH,IAGAe,KAAAhB,GAEA,MAAAO,EAAAC,OACAD,EAAAU,OAAAV,GAOA,OAHAW,EAAAR,KAAAS,MAAAD,EAAAb,GAAA,IAGAe,IAEA,SAAAA,IAEA,IADA,IAAAC,EACAf,EAAA,EAAiBA,EAAAY,EAAAV,OAA4BF,IAAA,CAG7C,IAFA,IAAAgB,EAAAJ,EAAAZ,GACAiB,GAAA,EACAC,EAAA,EAAkBA,EAAAF,EAAAd,OAA2BgB,IAAA,CAC7C,IAAAC,EAAAH,EAAAE,GACA,IAAAf,EAAAgB,KAAAF,GAAA,GAEAA,IACAL,EAAAQ,OAAApB,IAAA,GACAe,EAAAM,IAAAC,EAAAN,EAAA,KAGA,OAAAD,EAIA,IAAAQ,EAAA,GAGAC,EAAA,CACAC,IAAA,GAMAtB,EAAA,CACAsB,IAAA,GAGAb,EAAA,GAGA,SAAAc,EAAA9B,GACA,OAAAyB,EAAAM,EAAA,UAA6C/B,OAAA,KAA6BgC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,YAAgV3C,GAAA,MAI1Z,SAAAyB,EAAA1B,GAGA,GAAA4B,EAAA5B,GACA,OAAA4B,EAAA5B,GAAA6C,QAGA,IAAAC,EAAAlB,EAAA5B,GAAA,CACAK,EAAAL,EACA+C,GAAA,EACAF,QAAA,IAUA,OANA/B,EAAAd,GAAAa,KAAAiC,EAAAD,QAAAC,IAAAD,QAAAnB,GAGAoB,EAAAC,GAAA,EAGAD,EAAAD,QAKAnB,EAAAsB,EAAA,SAAA/C,GACA,IAAAgD,EAAA,GAIAC,EAAA,CAAoBjB,iBAAA,EAAAC,iBAAA,EAAAC,iBAAA,EAAAC,iBAAA,EAAAC,iBAAA,EAAAC,iBAAA,EAAAG,iBAAA,EAAAG,iBAAA,GACpBf,EAAA5B,GAAAgD,EAAAxC,KAAAoB,EAAA5B,IACA,IAAA4B,EAAA5B,IAAAiD,EAAAjD,IACAgD,EAAAxC,KAAAoB,EAAA5B,GAAA,IAAAkD,QAAA,SAAAC,EAAAC,GAIA,IAHA,IAAAC,EAAA,WAA4BrD,OAAA,KAA6BgC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,WAAAC,iBAAA,YAAgV3C,GAAA,OACzYsD,EAAA7B,EAAAM,EAAAsB,EACAE,EAAAC,SAAAC,qBAAA,QACArD,EAAA,EAAmBA,EAAAmD,EAAAjD,OAA6BF,IAAA,CAChD,IAAAsD,EAAAH,EAAAnD,GACAuD,EAAAD,EAAAE,aAAA,cAAAF,EAAAE,aAAA,QACA,kBAAAF,EAAAG,MAAAF,IAAAN,GAAAM,IAAAL,GAAA,OAAAH,IAEA,IAAAW,EAAAN,SAAAC,qBAAA,SACA,IAAArD,EAAA,EAAmBA,EAAA0D,EAAAxD,OAA8BF,IAAA,CACjDsD,EAAAI,EAAA1D,GACAuD,EAAAD,EAAAE,aAAA,aACA,GAAAD,IAAAN,GAAAM,IAAAL,EAAA,OAAAH,IAEA,IAAAY,EAAAP,SAAAQ,cAAA,QACAD,EAAAF,IAAA,aACAE,EAAAE,KAAA,WACAF,EAAAG,OAAAf,EACAY,EAAAI,QAAA,SAAAC,GACA,IAAAC,EAAAD,KAAAE,QAAAF,EAAAE,OAAAC,KAAAjB,EACAkB,EAAA,IAAAC,MAAA,qBAAAzE,EAAA,cAAAqE,EAAA,KACAG,EAAAH,iBACAzC,EAAA5B,GACA+D,EAAAW,WAAAC,YAAAZ,GACAX,EAAAoB,IAEAT,EAAAV,KAAAC,EAEA,IAAAsB,EAAApB,SAAAC,qBAAA,WACAmB,EAAAC,YAAAd,KACKe,KAAA,WACLlD,EAAA5B,GAAA,KAMA,IAAA+E,EAAAxE,EAAAP,GACA,OAAA+E,EAGA,GAAAA,EACA/B,EAAAxC,KAAAuE,EAAA,QACK,CAEL,IAAAC,EAAA,IAAA9B,QAAA,SAAAC,EAAAC,GACA2B,EAAAxE,EAAAP,GAAA,CAAAmD,EAAAC,KAEAJ,EAAAxC,KAAAuE,EAAA,GAAAC,GAGA,IACAC,EADAC,EAAA1B,SAAAQ,cAAA,UAGAkB,EAAAC,QAAA,QACAD,EAAAE,QAAA,IACA3D,EAAA4D,IACAH,EAAAI,aAAA,QAAA7D,EAAA4D,IAEAH,EAAAX,IAAAzC,EAAA9B,GAEAiF,EAAA,SAAAb,GAEAc,EAAAf,QAAAe,EAAAhB,OAAA,KACAqB,aAAAH,GACA,IAAAI,EAAAjF,EAAAP,GACA,OAAAwF,EAAA,CACA,GAAAA,EAAA,CACA,IAAAC,EAAArB,IAAA,SAAAA,EAAAH,KAAA,UAAAG,EAAAH,MACAyB,EAAAtB,KAAAE,QAAAF,EAAAE,OAAAC,IACAoB,EAAA,IAAAlB,MAAA,iBAAAzE,EAAA,cAAAyF,EAAA,KAAAC,EAAA,KACAC,EAAA1B,KAAAwB,EACAE,EAAAtB,QAAAqB,EACAF,EAAA,GAAAG,GAEApF,EAAAP,QAAA4F,IAGA,IAAAR,EAAAS,WAAA,WACAZ,EAAA,CAAwBhB,KAAA,UAAAK,OAAAY,KAClB,MACNA,EAAAf,QAAAe,EAAAhB,OAAAe,EACAzB,SAAAoB,KAAAC,YAAAK,GAGA,OAAAhC,QAAA4C,IAAA9C,IAIAvB,EAAAsE,EAAAlF,EAGAY,EAAAuE,EAAArE,EAGAF,EAAAwE,EAAA,SAAArD,EAAAsD,EAAAC,GACA1E,EAAA2E,EAAAxD,EAAAsD,IACAzF,OAAA4F,eAAAzD,EAAAsD,EAAA,CAA0CI,YAAA,EAAAC,IAAAJ,KAK1C1E,EAAA+E,EAAA,SAAA5D,GACA,qBAAA6D,eAAAC,aACAjG,OAAA4F,eAAAzD,EAAA6D,OAAAC,YAAA,CAAwDC,MAAA,WAExDlG,OAAA4F,eAAAzD,EAAA,cAAiD+D,OAAA,KAQjDlF,EAAAmF,EAAA,SAAAD,EAAAE,GAEA,GADA,EAAAA,IAAAF,EAAAlF,EAAAkF,IACA,EAAAE,EAAA,OAAAF,EACA,KAAAE,GAAA,kBAAAF,QAAAG,WAAA,OAAAH,EACA,IAAAI,EAAAtG,OAAAuG,OAAA,MAGA,GAFAvF,EAAA+E,EAAAO,GACAtG,OAAA4F,eAAAU,EAAA,WAAyCT,YAAA,EAAAK,UACzC,EAAAE,GAAA,iBAAAF,EAAA,QAAAM,KAAAN,EAAAlF,EAAAwE,EAAAc,EAAAE,EAAA,SAAAA,GAAgH,OAAAN,EAAAM,IAAqBC,KAAA,KAAAD,IACrI,OAAAF,GAIAtF,EAAA0F,EAAA,SAAAtE,GACA,IAAAsD,EAAAtD,KAAAiE,WACA,WAA2B,OAAAjE,EAAA,YAC3B,WAAiC,OAAAA,GAEjC,OADApB,EAAAwE,EAAAE,EAAA,IAAAA,GACAA,GAIA1E,EAAA2E,EAAA,SAAAgB,EAAAC,GAAsD,OAAA5G,OAAAC,UAAAC,eAAAC,KAAAwG,EAAAC,IAGtD5F,EAAAM,EAAA,eAGAN,EAAA6F,GAAA,SAAA9C,GAA8D,MAApB+C,QAAA5B,MAAAnB,GAAoBA,GAE9D,IAAAgD,EAAAC,OAAA,gBAAAA,OAAA,oBACAC,EAAAF,EAAAhH,KAAA0G,KAAAM,GACAA,EAAAhH,KAAAX,EACA2H,IAAAG,QACA,QAAAvH,EAAA,EAAgBA,EAAAoH,EAAAlH,OAAuBF,IAAAP,EAAA2H,EAAApH,IACvC,IAAAU,EAAA4G,EAIA1G,EAAAR,KAAA,qBAEAU,2LCjQA0G,OAAIC,IAAIC,OAAS,CACfC,SAAU,OCLZ,IAAIC,EAAM,WAAgB,IAAAC,EAAAC,KAAaC,EAAAF,EAAAG,eAA0BC,EAAAJ,EAAAK,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,SAAAA,EAAA,UAAAA,EAAA,aAAgDE,YAAA,aAAwB,CAAAF,EAAA,cAAAA,EAAA,4BACjKG,EAAA,GCDIC,EAAM,WAAgB,IAAAR,EAAAC,KAAaC,EAAAF,EAAAG,eAA0BC,EAAAJ,EAAAK,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,aAAuBE,YAAA,SAAAG,MAAA,CAA4B7G,IAAA,GAAA8G,KAAA,KAAoB,CAAAN,EAAA,mBAAwBE,YAAA,2BAAsC,CAAAF,EAAA,QAAAJ,EAAAW,GAAA,kBAAAP,EAAA,QAAiDE,YAAA,0BAAqC,CAAAN,EAAAW,GAAA,gBAAAP,EAAA,YAAAA,EAAA,SAAoDK,MAAA,CAAOG,KAAA,GAAAxF,KAAA,gCAAAiB,OAAA,WAAoE,CAAA+D,EAAA,QAAaE,YAAA,QAAmB,CAAAN,EAAAW,GAAA,yBAC/cE,EAAe,GCiBnBC,EAAA,GClBgYC,EAAA,mFCOhYC,EAAgBxI,OAAAyI,EAAA,KAAAzI,CACduI,EACAP,EACAK,GACF,EACA,KACA,KACA,MAIAG,EAAAE,QAAAC,OAAA,aACe,IAAAC,EAAAJ,EAAiB,QAQhCK,IAAiBL,EAAA,CACfM,OAAA,KACAC,QAAAC,EAAA,KACAC,WAAA,KACAC,cAAAC,EAAA,OChBF,IAAAC,EAAA,CACA3D,KAAA,MACA4D,WAAA,CACAT,UAEAvJ,KALA,WAMA,WCrB2WiK,EAAA,0BCOvWC,EAAYvJ,OAAAyI,EAAA,KAAAzI,CACdsJ,EACA/B,EACAQ,GACF,EACA,KACA,KACA,MAIAwB,EAASb,QAAAC,OAAA,UACM,IAAAa,EAAAD,EAAiB,QAMhCV,IAAkBU,EAAS,CACzBE,OAAA,KACAC,WAAA,uBC3BEC,EAAM,WAAgB,IAAAnC,EAAAC,KAAaC,EAAAF,EAAAG,eAA0BC,EAAAJ,EAAAK,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,QAAmB,CAAAF,EAAA,eAAoBK,MAAA,CAAO2B,eAAA,KAAmB,CAAAhC,EAAA,YAAiBK,MAAA,CAAO4B,IAAA,GAAAC,KAAA,KAAoBtC,EAAAuC,GAAAvC,EAAA,uBAAAwC,GAAmD,OAAApC,EAAA,UAAoBpB,IAAAwD,EAAAvE,KAAAwC,MAAA,CAA6BgC,KAAA,GAAAC,IAAA,GAAAC,IAAA,GAAAC,IAAA,KAAsC,CAAAxC,EAAA,UAAeE,YAAA,sBAAAuC,YAAA,CAA+CC,OAAA,WAAmBrC,MAAA,CAAQG,KAAA,IAAUmC,GAAA,CAAKC,MAAA,SAAAC,GAAyBjD,EAAAkD,cAAAV,MAAkC,CAAApC,EAAA,gBAAqBE,YAAA,iBAAAG,MAAA,CAAoC0C,gBAAA,KAAoB,CAAA/C,EAAA,MAAWE,YAAA,gCAA2C,CAAAN,EAAAW,GAAAX,EAAAoD,GAAAZ,EAAAvE,WAAAmC,EAAA,eAAAoC,EAAA,IAAApC,EAAA,KAAqFK,MAAA,CAAOrF,KAAAoH,EAAAa,IAAAhH,OAAA,WAA2C,CAAA2D,EAAAW,GAAAX,EAAAoD,GAAAZ,EAAAc,gBAAAlD,EAAA,OAAAJ,EAAAW,GAAAX,EAAAoD,GAAAZ,EAAAc,mBAAA,SAA4G,YACt3BC,EAAe,GCuBnBC,aAAA,CACA3L,KADA,WAEA,OACA4L,cAAA,KAGAC,QANA,WAMA,IAAAC,EAAA1D,KACAA,KAAA2D,MAAAtF,IAAA,QACAzB,KAAA,SAAAgH,GACAvE,QAAAwE,IAAAD,GACAF,EAAAF,cAAAI,EAAAhM,MACA,SAAAgM,GACAvE,QAAAwE,IAAAD,MAGAE,QAAA,CACAb,cADA,SACAc,GAAA,IAAAC,EAAAhE,KACAiE,EAAA,CACAF,MAAA/F,MAEAgC,KAAA2D,MAAAO,IAAA,OAAAH,EAAA/F,KAAAiG,GACArH,KAAA,SAAAgH,GACAvE,QAAAwE,IAAAD,GACA,WAAAG,EAAA/F,KACAgG,EAAAG,mBAAAJ,GAEAC,EAAAI,QAAA9L,KAAA,CAAA0F,KAAA,MAAAqG,OAAA,CAAAN,UAEA,SAAAH,GACAvE,QAAAwE,IAAAD,GACAU,MAAAV,EAAAhM,SAGAuM,mBAlBA,SAkBAJ,GAAA,IAAAQ,EAAAvE,KACAA,KAAA2D,MAAAtF,IAAA,wBAAA0F,EAAA/F,MACApB,KAAA,SAAAgH,GACAvE,QAAAwE,IAAAD,GACAW,EAAAH,QAAA9L,KAAA,CAAA0F,KAAA,iBAAAqG,OAAA,CAAAN,MAAAS,UAAAZ,EAAAhM,SACA,SAAAgM,GACAvE,QAAAwE,IAAAD,GACAU,MAAAV,EAAAhM,YChE8X6M,EAAA,0ECO1XC,EAAYnM,OAAAyI,EAAA,KAAAzI,CACdkM,EACAvC,EACAoB,GACF,EACA,KACA,KACA,MAIAoB,EAASzD,QAAAC,OAAA,WACM,IAAAyD,EAAAD,EAAiB,QAUhCtD,IAAkBsD,EAAS,CACzBE,QAAA,KACAC,UAAAC,EAAA,KACAC,aAAA,KACAC,aAAA,KACAC,QAAA,KACAC,UAAA,OC/BFxF,OAAIC,IAAIwF,QAEO,IAAAC,EAAA,IAAID,OAAO,CACtBE,OAAQ,CACJ,CAACC,KAAM,IAAKtH,KAAM,OAAQ+C,UAAW4D,GACrC,CAACW,KAAM,OAAQtH,KAAM,MAAOuH,OAAO,EAAMxE,UAAW,kBAAMxH,EAAAsB,EAAA,kBAAA+B,KAAArD,EAAAyF,KAAA,gBAC1D,CAACsG,KAAM,UAAWtH,KAAM,SAAUuH,OAAO,EAAMxE,UAAW,kBAAMxH,EAAAsB,EAAA,kBAAA+B,KAAArD,EAAAyF,KAAA,gBAChE,CAACsG,KAAM,YAAatH,KAAM,WAAYuH,OAAO,EAAMxE,UAAW,kBAAM/F,QAAA4C,IAAA,CAAArE,EAAAsB,EAAA,kBAAAtB,EAAAsB,EAAA,oBAAA+B,KAAArD,EAAAyF,KAAA,gBACpE,CAACsG,KAAM,iBAAkBtH,KAAM,gBAAiBuH,OAAO,EAAMxE,UAAW,kBAAM/F,QAAA4C,IAAA,CAAArE,EAAAsB,EAAA,kBAAAtB,EAAAsB,EAAA,oBAAA+B,KAAArD,EAAAyF,KAAA,gBAC9E,CAACsG,KAAM,WAAYtH,KAAM,UAAWuH,OAAO,EAAMxE,UAAW,kBAAM/F,QAAA4C,IAAA,CAAArE,EAAAsB,EAAA,kBAAAtB,EAAAsB,EAAA,kBAAAtB,EAAAsB,EAAA,oBAAA+B,KAAArD,EAAAyF,KAAA,gBAClE,CAACsG,KAAM,kBAAmBtH,KAAM,iBAAkBuH,OAAO,EAAMxE,UAAW,kBAAM/F,QAAA4C,IAAA,CAAArE,EAAAsB,EAAA,kBAAAtB,EAAAsB,EAAA,oBAAA+B,KAAArD,EAAAyF,KAAA,gBAChF,CAACsG,KAAM,eAAgBtH,KAAM,cAAeuH,OAAO,EAAMxE,UAAW,kBAAM/F,QAAA4C,IAAA,CAAArE,EAAAsB,EAAA,kBAAAtB,EAAAsB,EAAA,oBAAA+B,KAAArD,EAAAyF,KAAA,gBAC1E,CAACsG,KAAM,uBAAwBtH,KAAM,iBAAkBuH,OAAO,EAAMxE,UAAW,kBAAMxH,EAAAsB,EAAA,kBAAA+B,KAAArD,EAAAyF,KAAA,gBACrF,CAACsG,KAAM,eAAgBtH,KAAM,YAAauH,OAAO,EAAMxE,UAAW,kBAAM/F,QAAA4C,IAAA,CAAArE,EAAAsB,EAAA,kBAAAtB,EAAAsB,EAAA,oBAAA+B,KAAArD,EAAAyF,KAAA,gBACxE,CAACsG,KAAM,kBAAmBtH,KAAM,iBAAkBuH,OAAO,EAAMxE,UAAW,kBAAM/F,QAAA4C,IAAA,CAAArE,EAAAsB,EAAA,kBAAAtB,EAAAsB,EAAA,kBAAAtB,EAAAsB,EAAA,oBAAA+B,KAAArD,EAAAyF,KAAA,gBAChF,CAACsG,KAAM,IAAKE,SAAU,CAAExH,KAAM,YCbtC0B,OAAI+F,OAAOC,eAAgB,EAE3BhG,OAAIC,IAAIgG,QACRjG,OAAIkG,KAAK3E,QAAQ4E,KAAO,cAExB,IAAInG,OAAI,CACN0F,SACAU,OAAQ,SAAAC,GAAC,OAAIA,EAAEhE,MACdiE,OAAO","file":"js/app.f7576136.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t\"app\": 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-03cdf7e9\":\"b78159a4\",\"chunk-06393579\":\"58277927\",\"chunk-0fad73e8\":\"70ad8c4d\",\"chunk-24485444\":\"d8d0af6c\",\"chunk-975357a2\":\"f01b5bb0\",\"chunk-c2759cc8\":\"a0a44058\",\"chunk-2d0e5f4f\":\"8b281001\",\"chunk-2d216bc4\":\"2370be33\",\"chunk-f0297e60\":\"4aea2ebb\",\"chunk-2d0ac25c\":\"232aea9a\",\"chunk-711cdce4\":\"6d07f284\",\"chunk-9230b392\":\"0d33c639\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"chunk-03cdf7e9\":1,\"chunk-06393579\":1,\"chunk-0fad73e8\":1,\"chunk-24485444\":1,\"chunk-975357a2\":1,\"chunk-c2759cc8\":1,\"chunk-f0297e60\":1,\"chunk-9230b392\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"css/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-03cdf7e9\":\"a3bec636\",\"chunk-06393579\":\"271b7aec\",\"chunk-0fad73e8\":\"b29c19a2\",\"chunk-24485444\":\"3b67e5f7\",\"chunk-975357a2\":\"3367c996\",\"chunk-c2759cc8\":\"3ffd3865\",\"chunk-2d0e5f4f\":\"31d6cfe0\",\"chunk-2d216bc4\":\"31d6cfe0\",\"chunk-f0297e60\":\"b29c19a2\",\"chunk-2d0ac25c\":\"31d6cfe0\",\"chunk-711cdce4\":\"31d6cfe0\",\"chunk-9230b392\":\"2bc6ec50\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\tvar error = new Error('Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')');\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/jemo/setup/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import Vue from 'vue'\nimport Vuetify from 'vuetify/lib'\nimport 'vuetify/src/stylus/app.styl'\n\nVue.use(Vuetify, {\n iconfont: 'md',\n})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-app',[_c('navbar'),_c('v-content',{staticClass:\"mx-4 mb-4\"},[_c('keep-alive',[_c('router-view')],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-toolbar',{staticClass:\"indigo\",attrs:{\"app\":\"\",\"dark\":\"\"}},[_c('v-toolbar-title',{staticClass:\"headline text-uppercase\"},[_c('span',[_vm._v(\"Eclipse Jemo\")]),_c('span',{staticClass:\"font-weight-light mx-2\"},[_vm._v(\"Setup UI\")])]),_c('v-spacer'),_c('v-btn',{attrs:{\"flat\":\"\",\"href\":\"https://www.eclipse.org/jemo/\",\"target\":\"_blank\"}},[_c('span',{staticClass:\"mr-8\"},[_vm._v(\"Project page\")])])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <v-toolbar app dark class=\"indigo\">\n <v-toolbar-title class=\"headline text-uppercase\">\n\n <span>Eclipse Jemo</span>\n <span class=\"font-weight-light mx-2\">Setup UI</span>\n </v-toolbar-title>\n <v-spacer></v-spacer>\n <v-btn\n flat\n href=\"https://www.eclipse.org/jemo/\"\n target=\"_blank\">\n <span class=\"mr-8\">Project page</span>\n </v-btn>\n </v-toolbar>\n</template>\n\n<script>\n export default {\n\n }\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/vuetify-loader/lib/loader.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navbar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/vuetify-loader/lib/loader.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navbar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Navbar.vue?vue&type=template&id=adb4bf36&\"\nimport script from \"./Navbar.vue?vue&type=script&lang=js&\"\nexport * from \"./Navbar.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Navbar.vue\"\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib'\nimport { VSpacer } from 'vuetify/lib'\nimport { VToolbar } from 'vuetify/lib'\nimport { VToolbarTitle } from 'vuetify/lib'\ninstallComponents(component, {\n VBtn,\n VSpacer,\n VToolbar,\n VToolbarTitle,\n})\n","<template>\n <v-app>\n <navbar/>\n\n <v-content class=\"mx-4 mb-4\">\n <keep-alive>\n <router-view></router-view>\n </keep-alive>\n </v-content>\n </v-app>\n</template>\n\n<script>\n import Navbar from './components/Navbar';\n\n export default {\n name: 'App',\n components: {\n Navbar\n },\n data() {\n return {\n //\n }\n }\n }\n</script>\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/vuetify-loader/lib/loader.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/vuetify-loader/lib/loader.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=55eed8d2&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"App.vue\"\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VApp } from 'vuetify/lib'\nimport { VContent } from 'vuetify/lib'\ninstallComponents(component, {\n VApp,\n VContent,\n})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"home\"},[_c('v-container',{attrs:{\"grid-list-md\":\"\"}},[_c('v-layout',{attrs:{\"row\":\"\",\"wrap\":\"\"}},_vm._l((_vm.supportedCSPs),function(supportedCSP){return _c('v-flex',{key:supportedCSP.name,attrs:{\"xs12\":\"\",\"sm6\":\"\",\"md4\":\"\",\"lg3\":\"\"}},[_c('v-card',{staticClass:\"text-xs-center ma-3\",staticStyle:{\"cursor\":\"pointer\"},attrs:{\"flat\":\"\"},on:{\"click\":function($event){_vm.onCspSelected(supportedCSP)}}},[_c('v-card-title',{staticClass:\"justify-center\",attrs:{\"primary-title\":\"\"}},[_c('h3',{staticClass:\"headline justify-center mb-0\"},[_vm._v(_vm._s(supportedCSP.name))])]),_c('v-card-text',[(supportedCSP.url)?_c('a',{attrs:{\"href\":supportedCSP.url,\"target\":\"_blank\"}},[_vm._v(_vm._s(supportedCSP.description))]):_c('div',[_vm._v(_vm._s(supportedCSP.description))])])],1)],1)}),1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"home\">\n\n <v-container grid-list-md>\n <v-layout row wrap>\n <v-flex xs12 sm6 md4 lg3 v-for=\"supportedCSP in supportedCSPs\" :key=\"supportedCSP.name\">\n <v-card flat class=\"text-xs-center ma-3\" @click=\"onCspSelected(supportedCSP)\" style=\"cursor: pointer;\">\n <v-card-title primary-title class=\"justify-center\">\n <h3 class=\"headline justify-center mb-0\">{{supportedCSP.name}}</h3>\n </v-card-title>\n <v-card-text>\n <a v-if=\"supportedCSP.url\" :href=\"supportedCSP.url\" target=\"_blank\">{{supportedCSP.description}}</a>\n <div v-else>{{supportedCSP.description}}</div>\n </v-card-text>\n </v-card>\n </v-flex>\n </v-layout>\n </v-container>\n\n </div>\n</template>\n\n<script>\n\n export default {\n data() {\n return {\n supportedCSPs: []\n };\n },\n created() {\n this.$http.get('init')\n .then(response => {\n console.log(response);\n this.supportedCSPs = response.data\n }, response => {\n console.log(response);\n });\n },\n methods: {\n onCspSelected(csp) {\n const payload = {\n csp: csp.name\n }\n this.$http.put('csp/' + csp.name, payload)\n .then(response => {\n console.log(response);\n if (csp.name === 'MEMORY') {\n this.redirectToParamSet(csp);\n } else {\n this.$router.push({name: 'csp', params: {csp: csp}})\n }\n }, response => {\n console.log(response);\n alert(response.data);\n });\n },\n redirectToParamSet(csp) {\n this.$http.get('jemoparams/paramsets/' + csp.name)\n .then(response => {\n console.log(response);\n this.$router.push({name: 'jemo-param-set', params: {csp: csp, paramSets: response.data}})\n }, response => {\n console.log(response);\n alert(response.data);\n });\n }\n }\n }\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/vuetify-loader/lib/loader.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/vuetify-loader/lib/loader.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Home.vue?vue&type=template&id=b86b620e&\"\nimport script from \"./Home.vue?vue&type=script&lang=js&\"\nexport * from \"./Home.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Home.vue\"\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VCard } from 'vuetify/lib'\nimport { VCardText } from 'vuetify/lib'\nimport { VCardTitle } from 'vuetify/lib'\nimport { VContainer } from 'vuetify/lib'\nimport { VFlex } from 'vuetify/lib'\nimport { VLayout } from 'vuetify/lib'\ninstallComponents(component, {\n VCard,\n VCardText,\n VCardTitle,\n VContainer,\n VFlex,\n VLayout,\n})\n","import Vue from 'vue'\nimport Router from 'vue-router'\nimport Home from './views/Home.vue'\n\nVue.use(Router)\n\nexport default new Router({\n routes: [\n {path: '/', name: 'home', component: Home},\n {path: '/csp', name: 'csp', props: true, component: () => import('./views/Csp.vue')},\n {path: '/delete', name: 'delete', props: true, component: () => import('./views/Delete.vue')},\n {path: '/csp-cred', name: 'csp-cred', props: true, component: () => import('./views/CspCredentials.vue')},\n {path: '/install/props', name: 'install-props', props: true, component: () => import('./views/InstallProps.vue')},\n {path: '/install', name: 'install', props: true, component: () => import('./views/Install.vue')},\n {path: '/jemo/param-set', name: 'jemo-param-set', props: true, component: () => import('./views/JemoParamSet.vue')},\n {path: '/jemo/params', name: 'jemo-params', props: true, component: () => import('./views/JemoParams.vue')},\n {path: '/jemo/setup-complete', name: 'setup-complete', props: true, component: () => import('./views/SetupComplete.vue')},\n {path: '/prod/config', name: 'prod-conf', props: true, component: () => import('./views/ProdConf.vue')},\n {path: '/cluster/create', name: 'create-cluster', props: true, component: () => import('./views/CreateCluster.vue')},\n {path: '*', redirect: { name: 'home' }}\n ]\n})\n","import Vue from 'vue'\nimport VueResource from 'vue-resource'\nimport './plugins/vuetify'\nimport App from './App.vue'\nimport router from './router'\n\nVue.config.productionTip = false;\n\nVue.use(VueResource);\nVue.http.options.root = '/jemo/setup';\n\nnew Vue({\n router,\n render: h => h(App)\n}).$mount('#app')\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/plugins/vuetify.js","webpack:///./src/App.vue?4f79","webpack:///./src/components/Navbar.vue?3908","webpack:///src/components/Navbar.vue","webpack:///./src/components/Navbar.vue?e293","webpack:///./src/components/Navbar.vue","webpack:///src/App.vue","webpack:///./src/App.vue?0bd2","webpack:///./src/App.vue","webpack:///./src/views/Home.vue?50ff","webpack:///src/views/Home.vue","webpack:///./src/views/Home.vue?f351","webpack:///./src/views/Home.vue","webpack:///./src/router.js","webpack:///./src/main.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","installedCssChunks","app","jsonpScriptSrc","p","chunk-03cdf7e9","chunk-06393579","chunk-0fad73e8","chunk-24485444","chunk-975357a2","chunk-c2759cc8","chunk-2d0e5f4f","chunk-2d216bc4","chunk-f0297e60","chunk-2d0ac25c","chunk-711cdce4","chunk-9230b392","exports","module","l","e","promises","cssChunks","Promise","resolve","reject","href","fullhref","existingLinkTags","document","getElementsByTagName","tag","dataHref","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","parentNode","removeChild","head","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","clearTimeout","chunk","errorType","realSrc","error","undefined","setTimeout","all","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","Vue","use","Vuetify","iconfont","Appvue_type_template_id_55eed8d2_render","_vm","this","_h","$createElement","_c","_self","staticClass","staticRenderFns","Navbarvue_type_template_id_adb4bf36_render","attrs","dark","_v","flat","Navbarvue_type_template_id_adb4bf36_staticRenderFns","Navbarvue_type_script_lang_js_","components_Navbarvue_type_script_lang_js_","component","componentNormalizer","options","__file","Navbar","installComponents_default","VBtn","VSpacer","VGrid","VToolbar","VToolbarTitle","components_VToolbar","Appvue_type_script_lang_js_","components","src_Appvue_type_script_lang_js_","App_component","App","VApp","VContent","Homevue_type_template_id_b86b620e_render","grid-list-md","row","wrap","_l","supportedCSP","xs12","sm6","md4","lg3","staticStyle","cursor","on","click","$event","onCspSelected","primary-title","_s","url","description","Homevue_type_template_id_b86b620e_staticRenderFns","Homevue_type_script_lang_js_","supportedCSPs","created","_this","$http","response","log","methods","csp","_this2","payload","put","redirectToParamSet","$router","params","alert","_this3","paramSets","views_Homevue_type_script_lang_js_","Home_component","Home","VCard","VCardText","components_VCard","VCardTitle","VContainer","VFlex","VLayout","Router","router","routes","path","props","redirect","config","productionTip","VueResource","http","root","render","h","$mount"],"mappings":"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","file":"js/app.2510375b.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t\"app\": 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-03cdf7e9\":\"b78159a4\",\"chunk-06393579\":\"58277927\",\"chunk-0fad73e8\":\"70ad8c4d\",\"chunk-24485444\":\"d8d0af6c\",\"chunk-975357a2\":\"a9960b1d\",\"chunk-c2759cc8\":\"a0a44058\",\"chunk-2d0e5f4f\":\"8b281001\",\"chunk-2d216bc4\":\"d0c185c1\",\"chunk-f0297e60\":\"4aea2ebb\",\"chunk-2d0ac25c\":\"232aea9a\",\"chunk-711cdce4\":\"6d07f284\",\"chunk-9230b392\":\"0d33c639\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"chunk-03cdf7e9\":1,\"chunk-06393579\":1,\"chunk-0fad73e8\":1,\"chunk-24485444\":1,\"chunk-975357a2\":1,\"chunk-c2759cc8\":1,\"chunk-f0297e60\":1,\"chunk-9230b392\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"css/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-03cdf7e9\":\"a3bec636\",\"chunk-06393579\":\"271b7aec\",\"chunk-0fad73e8\":\"b29c19a2\",\"chunk-24485444\":\"3b67e5f7\",\"chunk-975357a2\":\"3367c996\",\"chunk-c2759cc8\":\"3ffd3865\",\"chunk-2d0e5f4f\":\"31d6cfe0\",\"chunk-2d216bc4\":\"31d6cfe0\",\"chunk-f0297e60\":\"b29c19a2\",\"chunk-2d0ac25c\":\"31d6cfe0\",\"chunk-711cdce4\":\"31d6cfe0\",\"chunk-9230b392\":\"2bc6ec50\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\tvar error = new Error('Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')');\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/jemo/setup/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import Vue from 'vue'\nimport Vuetify from 'vuetify/lib'\nimport 'vuetify/src/stylus/app.styl'\n\nVue.use(Vuetify, {\n iconfont: 'md',\n})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-app',[_c('navbar'),_c('v-content',{staticClass:\"mx-4 mb-4\"},[_c('keep-alive',[_c('router-view')],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-toolbar',{staticClass:\"indigo\",attrs:{\"app\":\"\",\"dark\":\"\"}},[_c('v-toolbar-title',{staticClass:\"headline text-uppercase\"},[_c('span',[_vm._v(\"Eclipse Jemo\")]),_c('span',{staticClass:\"font-weight-light mx-2\"},[_vm._v(\"Setup UI\")])]),_c('v-spacer'),_c('v-btn',{attrs:{\"flat\":\"\",\"href\":\"https://www.eclipse.org/jemo/\",\"target\":\"_blank\"}},[_c('span',{staticClass:\"mr-8\"},[_vm._v(\"Project page\")])])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <v-toolbar app dark class=\"indigo\">\n <v-toolbar-title class=\"headline text-uppercase\">\n\n <span>Eclipse Jemo</span>\n <span class=\"font-weight-light mx-2\">Setup UI</span>\n </v-toolbar-title>\n <v-spacer></v-spacer>\n <v-btn\n flat\n href=\"https://www.eclipse.org/jemo/\"\n target=\"_blank\">\n <span class=\"mr-8\">Project page</span>\n </v-btn>\n </v-toolbar>\n</template>\n\n<script>\n export default {\n\n }\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/vuetify-loader/lib/loader.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navbar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/vuetify-loader/lib/loader.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navbar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Navbar.vue?vue&type=template&id=adb4bf36&\"\nimport script from \"./Navbar.vue?vue&type=script&lang=js&\"\nexport * from \"./Navbar.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Navbar.vue\"\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib'\nimport { VSpacer } from 'vuetify/lib'\nimport { VToolbar } from 'vuetify/lib'\nimport { VToolbarTitle } from 'vuetify/lib'\ninstallComponents(component, {\n VBtn,\n VSpacer,\n VToolbar,\n VToolbarTitle,\n})\n","<template>\n <v-app>\n <navbar/>\n\n <v-content class=\"mx-4 mb-4\">\n <keep-alive>\n <router-view></router-view>\n </keep-alive>\n </v-content>\n </v-app>\n</template>\n\n<script>\n import Navbar from './components/Navbar';\n\n export default {\n name: 'App',\n components: {\n Navbar\n },\n data() {\n return {\n //\n }\n }\n }\n</script>\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/vuetify-loader/lib/loader.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/vuetify-loader/lib/loader.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=55eed8d2&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"App.vue\"\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VApp } from 'vuetify/lib'\nimport { VContent } from 'vuetify/lib'\ninstallComponents(component, {\n VApp,\n VContent,\n})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"home\"},[_c('v-container',{attrs:{\"grid-list-md\":\"\"}},[_c('v-layout',{attrs:{\"row\":\"\",\"wrap\":\"\"}},_vm._l((_vm.supportedCSPs),function(supportedCSP){return _c('v-flex',{key:supportedCSP.name,attrs:{\"xs12\":\"\",\"sm6\":\"\",\"md4\":\"\",\"lg3\":\"\"}},[_c('v-card',{staticClass:\"text-xs-center ma-3\",staticStyle:{\"cursor\":\"pointer\"},attrs:{\"flat\":\"\"},on:{\"click\":function($event){_vm.onCspSelected(supportedCSP)}}},[_c('v-card-title',{staticClass:\"justify-center\",attrs:{\"primary-title\":\"\"}},[_c('h3',{staticClass:\"headline justify-center mb-0\"},[_vm._v(_vm._s(supportedCSP.name))])]),_c('v-card-text',[(supportedCSP.url)?_c('a',{attrs:{\"href\":supportedCSP.url,\"target\":\"_blank\"}},[_vm._v(_vm._s(supportedCSP.description))]):_c('div',[_vm._v(_vm._s(supportedCSP.description))])])],1)],1)}),1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"home\">\n\n <v-container grid-list-md>\n <v-layout row wrap>\n <v-flex xs12 sm6 md4 lg3 v-for=\"supportedCSP in supportedCSPs\" :key=\"supportedCSP.name\">\n <v-card flat class=\"text-xs-center ma-3\" @click=\"onCspSelected(supportedCSP)\" style=\"cursor: pointer;\">\n <v-card-title primary-title class=\"justify-center\">\n <h3 class=\"headline justify-center mb-0\">{{supportedCSP.name}}</h3>\n </v-card-title>\n <v-card-text>\n <a v-if=\"supportedCSP.url\" :href=\"supportedCSP.url\" target=\"_blank\">{{supportedCSP.description}}</a>\n <div v-else>{{supportedCSP.description}}</div>\n </v-card-text>\n </v-card>\n </v-flex>\n </v-layout>\n </v-container>\n\n </div>\n</template>\n\n<script>\n\n export default {\n data() {\n return {\n supportedCSPs: []\n };\n },\n created() {\n this.$http.get('init')\n .then(response => {\n console.log(response);\n this.supportedCSPs = response.data\n }, response => {\n console.log(response);\n });\n },\n methods: {\n onCspSelected(csp) {\n const payload = {\n csp: csp.name\n }\n this.$http.put('csp/' + csp.name, payload)\n .then(response => {\n console.log(response);\n if (csp.name === 'MEMORY') {\n this.redirectToParamSet(csp);\n } else {\n this.$router.push({name: 'csp', params: {csp: csp}})\n }\n }, response => {\n console.log(response);\n alert(response.data);\n });\n },\n redirectToParamSet(csp) {\n this.$http.get('jemoparams/paramsets/' + csp.name)\n .then(response => {\n console.log(response);\n this.$router.push({name: 'jemo-param-set', params: {csp: csp, paramSets: response.data}})\n }, response => {\n console.log(response);\n alert(response.data);\n });\n }\n }\n }\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/vuetify-loader/lib/loader.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/vuetify-loader/lib/loader.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Home.vue?vue&type=template&id=b86b620e&\"\nimport script from \"./Home.vue?vue&type=script&lang=js&\"\nexport * from \"./Home.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Home.vue\"\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VCard } from 'vuetify/lib'\nimport { VCardText } from 'vuetify/lib'\nimport { VCardTitle } from 'vuetify/lib'\nimport { VContainer } from 'vuetify/lib'\nimport { VFlex } from 'vuetify/lib'\nimport { VLayout } from 'vuetify/lib'\ninstallComponents(component, {\n VCard,\n VCardText,\n VCardTitle,\n VContainer,\n VFlex,\n VLayout,\n})\n","import Vue from 'vue'\nimport Router from 'vue-router'\nimport Home from './views/Home.vue'\n\nVue.use(Router)\n\nexport default new Router({\n routes: [\n {path: '/', name: 'home', component: Home},\n {path: '/csp', name: 'csp', props: true, component: () => import('./views/Csp.vue')},\n {path: '/delete', name: 'delete', props: true, component: () => import('./views/Delete.vue')},\n {path: '/csp-cred', name: 'csp-cred', props: true, component: () => import('./views/CspCredentials.vue')},\n {path: '/install/props', name: 'install-props', props: true, component: () => import('./views/InstallProps.vue')},\n {path: '/install', name: 'install', props: true, component: () => import('./views/Install.vue')},\n {path: '/jemo/param-set', name: 'jemo-param-set', props: true, component: () => import('./views/JemoParamSet.vue')},\n {path: '/jemo/params', name: 'jemo-params', props: true, component: () => import('./views/JemoParams.vue')},\n {path: '/jemo/setup-complete', name: 'setup-complete', props: true, component: () => import('./views/SetupComplete.vue')},\n {path: '/prod/config', name: 'prod-conf', props: true, component: () => import('./views/ProdConf.vue')},\n {path: '/cluster/create', name: 'create-cluster', props: true, component: () => import('./views/CreateCluster.vue')},\n {path: '*', redirect: { name: 'home' }}\n ]\n})\n","import Vue from 'vue'\nimport VueResource from 'vue-resource'\nimport './plugins/vuetify'\nimport App from './App.vue'\nimport router from './router'\n\nVue.config.productionTip = false;\n\nVue.use(VueResource);\nVue.http.options.root = '/jemo/setup';\n\nnew Vue({\n router,\n render: h => h(App)\n}).$mount('#app')\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/core/src/main/resources/setup/js/chunk-2d216bc4.2370be33.js b/core/src/main/resources/setup/js/chunk-2d216bc4.2370be33.js
deleted file mode 100644
index b907423..0000000
--- a/core/src/main/resources/setup/js/chunk-2d216bc4.2370be33.js
+++ /dev/null
@@ -1,2 +0,0 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d216bc4"],{c474:function(e,t,r){"use strict";r.r(t);var a=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("v-container",{staticClass:"ma-5",attrs:{"grid-list-md":""}},[e.downloadFormsOnly||e.clusterCreated||e.error?e._e():r("div",[r("h3",[e._v("Please wait while Jemo creates the cluster. This can take up to 15 minutes.")]),r("v-progress-linear",{attrs:{indeterminate:!0}}),e.clusterCreationResponse?r("div",[r("pre",[e._v(e._s(e.clusterCreationResponse.output))]),r("div",{staticClass:"pa-3"},[r("v-progress-circular",{attrs:{indeterminate:"",size:16}})],1)]):e._e()],1),e.error?r("div",["TERRAFORM_NOT_INSTALLED"===e.error.code?r("div",[r("h3",[e._v("The server can not find the terraform command.")]),e._v("\n Either terraform is not installed ("),r("a",{attrs:{href:"https://learn.hashicorp.com/terraform/getting-started/install.html",target:"_blank"}},[e._v("Installation\n instructions")]),e._v("),\n or it is not in the path. (e.g. run: terraform -version).\n "),r("br"),r("br"),r("v-btn",{attrs:{color:"primary",loading:e.loading},on:{click:function(t){e.createCluster(!0)}}},[e._v("Fixed")])],1):"KUBECTL_NOT_INSTALLED"===e.error.code?r("div",[r("h3",[e._v("The server can not find the kubectl command.")]),e._v("\n Either kubectl is not installed ("),r("a",{attrs:{href:"https://kubernetes.io/docs/tasks/tools/install-kubectl/",target:"_blank"}},[e._v("Installation\n instructions")]),e._v("),\n or it is not in the path. (e.g. run: kubectl --help).\n "),r("br"),r("br"),r("v-btn",{attrs:{color:"primary",loading:e.loading},on:{click:function(t){e.createCluster(!0)}}},[e._v("Fixed")])],1):r("div",[r("h3",[e._v("Terraform failed to create the cluster. The following error occurred:")]),r("pre",[e._v(e._s(e.error.message))]),r("br"),r("v-btn",{attrs:{to:{name:"delete",params:{csp:this.csp,mode:"CLUSTER"}},color:"primary"}},[e._v("Revert")])],1)]):e._e(),e.clusterCreated?r("div",[r("h3",[e._v("Setup Completed")]),r("br"),e._v("\n Great job! The cluster is created.\n "),r("br"),e._v("\n You can access jemo on "),r("a",{attrs:{href:e.clusterCreationResponse.loadBalancerUrl,target:"_blank"}},[e._v(e._s(e.clusterCreationResponse.loadBalancerUrl))]),e._v(".\n You may need to wait 1-2 minutes before accessing it.\n "),r("br"),r("br"),e._v("\n Terraform reported the following created resources and outputs.\n "),r("br"),r("br"),r("v-toolbar",{attrs:{flat:"",color:"white"}},[r("v-toolbar-title",[e._v("Created Resources")])],1),r("v-data-table",{staticClass:"elevation-1",attrs:{items:e.createItems(e.clusterCreationResponse.terraformResult.createdResources),"hide-actions":"","hide-headers":""},scopedSlots:e._u([{key:"items",fn:function(t){return[r("td",[e._v(e._s(t.item.name))]),r("td",[e._v(e._s(t.item.value))])]}}])}),r("br"),r("v-toolbar",{attrs:{flat:"",color:"white"}},[r("v-toolbar-title",[e._v("Outputs")])],1),r("v-data-table",{staticClass:"elevation-1",attrs:{items:e.createItems(e.clusterCreationResponse.terraformResult.outputs),"hide-actions":"","hide-headers":""},scopedSlots:e._u([{key:"items",fn:function(t){return[r("td",[e._v(e._s(t.item.name))]),r("td",[e._v(e._s(t.item.value))])]}}])}),r("br")],1):e._e(),e.terraformFilesDownloaded?r("div",[r("h3",[e._v("Please unzip the downloaded file, open the file 'README.txt' and follow the instructions.")])]):e._e()])},s=[],o=(r("7f7f"),{data:function(){return{csp:this.$route.params.csp,parameters:this.$route.params.parameters,downloadFormsOnly:this.$route.params.downloadFormsOnly,clusterCreated:!1,error:null,clusterCreationResponse:null,terraformFilesDownloaded:!1,timer:null,loading:!1}},watch:{$route:function(e){"create-cluster"===e.name&&(this.csp=e.params.csp?e.params.csp:this.csp,this.parameters=e.params.parameters?e.params.parameters:this.parameters,this.downloadFormsOnly=e.params.downloadFormsOnly,this.clusterCreated=!1,this.loading=!1,this.createCluster(!1))}},mounted:function(){this.createCluster(!1)},methods:{createCluster:function(e){var t=this;this.loading=e;var r={csp:this.csp.name,parameters:this.parameters};this.downloadFormsOnly?this.$http.post("cluster/download",r,{responseType:"blob"}).then(function(e){return e.blob()}).then(function(e){var r=document.createElement("a");document.body.appendChild(r);var a=window.URL.createObjectURL(e);r.href=a,r.download="cluster.zip",r.click(),window.URL.revokeObjectURL(a),r.remove(),t.terraformFilesDownloaded=!0}):this.$http.post("cluster",r).then(function(e){console.log(e),t.error=null,t.timer=setInterval(t.pollForClusterCreationResult,1e4)},function(e){console.log(e),t.error=e.data,t.loading=!1})},pollForClusterCreationResult:function(){var e=this;this.$http.get("cluster/result").then(function(t){console.log(t),e.clusterCreationResponse=t.data,"FINISHED"===t.data.status&&(clearInterval(e.timer),t.data.error?e.error=t.data.error:(e.clusterCreated=!0,e.error=null))},function(t){clearInterval(e.timer),console.log(t),e.error=t.data,alert(t.data)})},createItems:function(e){var t=[];for(var r in e)t.push({name:r,value:e[r]});return console.log(t),t}}}),n=o,l=r("2877"),i=r("6544"),c=r.n(i),u=r("8336"),d=r("a523"),m=r("8fea"),p=r("490a"),h=r("8e36"),v=r("71d9"),f=r("2a7f"),_=Object(l["a"])(n,a,s,!1,null,null,null);_.options.__file="CreateCluster.vue";t["default"]=_.exports;c()(_,{VBtn:u["a"],VContainer:d["a"],VDataTable:m["a"],VProgressCircular:p["a"],VProgressLinear:h["a"],VToolbar:v["a"],VToolbarTitle:f["a"]})}}]);
-//# sourceMappingURL=chunk-2d216bc4.2370be33.js.map
\ No newline at end of file
diff --git a/core/src/main/resources/setup/js/chunk-2d216bc4.2370be33.js.map b/core/src/main/resources/setup/js/chunk-2d216bc4.2370be33.js.map
deleted file mode 100644
index 917d42d..0000000
--- a/core/src/main/resources/setup/js/chunk-2d216bc4.2370be33.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["webpack:///./src/views/CreateCluster.vue?ee67","webpack:///src/views/CreateCluster.vue","webpack:///./src/views/CreateCluster.vue?94b9","webpack:///./src/views/CreateCluster.vue"],"names":["render","_vm","this","_h","$createElement","_c","_self","staticClass","attrs","grid-list-md","downloadFormsOnly","clusterCreated","error","_e","_v","indeterminate","_s","clusterCreationResponse","output","size","code","href","target","color","loading","on","click","$event","createCluster","message","to","name","params","csp","mode","loadBalancerUrl","flat","items","createItems","terraformResult","createdResources","hide-actions","hide-headers","scopedSlots","_u","key","fn","props","item","value","outputs","staticRenderFns","CreateClustervue_type_script_lang_js_","data","$route","parameters","terraformFilesDownloaded","timer","watch","mounted","methods","fixedPressed","_this","payload","$http","post","responseType","then","response","blob","a","document","createElement","body","appendChild","url","window","URL","createObjectURL","download","revokeObjectURL","remove","console","log","setInterval","pollForClusterCreationResult","_this2","get","status","clearInterval","alert","jsonObject","push","views_CreateClustervue_type_script_lang_js_","component","Object","componentNormalizer","options","__file","__webpack_exports__","installComponents_default","VBtn","VContainer","VDataTable","VProgressCircular","VProgressLinear","VToolbar","VToolbarTitle","components_VToolbar"],"mappings":"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","file":"js/chunk-2d216bc4.2370be33.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-container',{staticClass:\"ma-5\",attrs:{\"grid-list-md\":\"\"}},[(!_vm.downloadFormsOnly && !_vm.clusterCreated && !_vm.error)?_c('div',[_c('h3',[_vm._v(\"Please wait while Jemo creates the cluster. This can take up to 15 minutes.\")]),_c('v-progress-linear',{attrs:{\"indeterminate\":true}}),(_vm.clusterCreationResponse)?_c('div',[_c('pre',[_vm._v(_vm._s(_vm.clusterCreationResponse.output))]),_c('div',{staticClass:\"pa-3\"},[_c('v-progress-circular',{attrs:{\"indeterminate\":\"\",\"size\":16}})],1)]):_vm._e()],1):_vm._e(),(_vm.error)?_c('div',[(_vm.error.code === 'TERRAFORM_NOT_INSTALLED')?_c('div',[_c('h3',[_vm._v(\"The server can not find the terraform command.\")]),_vm._v(\"\\n Either terraform is not installed (\"),_c('a',{attrs:{\"href\":\"https://learn.hashicorp.com/terraform/getting-started/install.html\",\"target\":\"_blank\"}},[_vm._v(\"Installation\\n instructions\")]),_vm._v(\"),\\n or it is not in the path. (e.g. run: terraform -version).\\n \"),_c('br'),_c('br'),_c('v-btn',{attrs:{\"color\":\"primary\",\"loading\":_vm.loading},on:{\"click\":function($event){_vm.createCluster(true)}}},[_vm._v(\"Fixed\")])],1):(_vm.error.code === 'KUBECTL_NOT_INSTALLED')?_c('div',[_c('h3',[_vm._v(\"The server can not find the kubectl command.\")]),_vm._v(\"\\n Either kubectl is not installed (\"),_c('a',{attrs:{\"href\":\"https://kubernetes.io/docs/tasks/tools/install-kubectl/\",\"target\":\"_blank\"}},[_vm._v(\"Installation\\n instructions\")]),_vm._v(\"),\\n or it is not in the path. (e.g. run: kubectl --help).\\n \"),_c('br'),_c('br'),_c('v-btn',{attrs:{\"color\":\"primary\",\"loading\":_vm.loading},on:{\"click\":function($event){_vm.createCluster(true)}}},[_vm._v(\"Fixed\")])],1):_c('div',[_c('h3',[_vm._v(\"Terraform failed to create the cluster. The following error occurred:\")]),_c('pre',[_vm._v(_vm._s(_vm.error.message))]),_c('br'),_c('v-btn',{attrs:{\"to\":{name: 'delete', params: {csp: this.csp, mode: 'CLUSTER'}},\"color\":\"primary\"}},[_vm._v(\"Revert\")])],1)]):_vm._e(),(_vm.clusterCreated)?_c('div',[_c('h3',[_vm._v(\"Setup Completed\")]),_c('br'),_vm._v(\"\\n Great job! The cluster is created.\\n \"),_c('br'),_vm._v(\"\\n You can access jemo on \"),_c('a',{attrs:{\"href\":_vm.clusterCreationResponse.loadBalancerUrl,\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.clusterCreationResponse.loadBalancerUrl))]),_vm._v(\".\\n You may need to wait 1-2 minutes before accessing it.\\n \"),_c('br'),_c('br'),_vm._v(\"\\n Terraform reported the following created resources and outputs.\\n \"),_c('br'),_c('br'),_c('v-toolbar',{attrs:{\"flat\":\"\",\"color\":\"white\"}},[_c('v-toolbar-title',[_vm._v(\"Created Resources\")])],1),_c('v-data-table',{staticClass:\"elevation-1\",attrs:{\"items\":_vm.createItems(_vm.clusterCreationResponse.terraformResult.createdResources),\"hide-actions\":\"\",\"hide-headers\":\"\"},scopedSlots:_vm._u([{key:\"items\",fn:function(props){return [_c('td',[_vm._v(_vm._s(props.item.name))]),_c('td',[_vm._v(_vm._s(props.item.value))])]}}])}),_c('br'),_c('v-toolbar',{attrs:{\"flat\":\"\",\"color\":\"white\"}},[_c('v-toolbar-title',[_vm._v(\"Outputs\")])],1),_c('v-data-table',{staticClass:\"elevation-1\",attrs:{\"items\":_vm.createItems(_vm.clusterCreationResponse.terraformResult.outputs),\"hide-actions\":\"\",\"hide-headers\":\"\"},scopedSlots:_vm._u([{key:\"items\",fn:function(props){return [_c('td',[_vm._v(_vm._s(props.item.name))]),_c('td',[_vm._v(_vm._s(props.item.value))])]}}])}),_c('br')],1):_vm._e(),(_vm.terraformFilesDownloaded)?_c('div',[_c('h3',[_vm._v(\"Please unzip the downloaded file, open the file 'README.txt' and follow the instructions.\")])]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\n <v-container grid-list-md class=\"ma-5\">\n <div v-if=\"!downloadFormsOnly && !clusterCreated && !error\">\n <h3>Please wait while Jemo creates the cluster. This can take up to 15 minutes.</h3>\n <v-progress-linear :indeterminate=\"true\"></v-progress-linear>\n <div v-if=\"clusterCreationResponse\">\n <pre>{{ clusterCreationResponse.output }}</pre>\n <div class=\"pa-3\">\n <v-progress-circular indeterminate :size=\"16\"></v-progress-circular>\n </div>\n </div>\n </div>\n\n <div v-if=\"error\">\n <div v-if=\"error.code === 'TERRAFORM_NOT_INSTALLED'\">\n <h3>The server can not find the terraform command.</h3>\n Either terraform is not installed (<a\n href=\"https://learn.hashicorp.com/terraform/getting-started/install.html\" target=\"_blank\">Installation\n instructions</a>),\n or it is not in the path. (e.g. run: terraform -version).\n <br/>\n <br/>\n <v-btn @click=\"createCluster(true)\" color=\"primary\" :loading=\"loading\">Fixed</v-btn>\n </div>\n <div v-else-if=\"error.code === 'KUBECTL_NOT_INSTALLED'\">\n <h3>The server can not find the kubectl command.</h3>\n Either kubectl is not installed (<a\n href=\"https://kubernetes.io/docs/tasks/tools/install-kubectl/\" target=\"_blank\">Installation\n instructions</a>),\n or it is not in the path. (e.g. run: kubectl --help).\n <br/>\n <br/>\n <v-btn @click=\"createCluster(true)\" color=\"primary\" :loading=\"loading\">Fixed</v-btn>\n </div>\n <div v-else>\n <h3>Terraform failed to create the cluster. The following error occurred:</h3>\n <pre>{{error.message}}</pre>\n\n <br>\n <v-btn :to=\"{name: 'delete', params: {csp: this.csp, mode: 'CLUSTER'}}\" color=\"primary\">Revert</v-btn>\n </div>\n </div>\n\n <div v-if=\"clusterCreated\">\n <h3>Setup Completed</h3>\n <br/>\n Great job! The cluster is created.\n <br/>\n You can access jemo on <a :href=clusterCreationResponse.loadBalancerUrl target=\"_blank\">{{clusterCreationResponse.loadBalancerUrl}}</a>.\n You may need to wait 1-2 minutes before accessing it.\n <br/>\n <br/>\n Terraform reported the following created resources and outputs.\n <br/>\n <br/>\n\n <v-toolbar flat color=\"white\">\n <v-toolbar-title>Created Resources</v-toolbar-title>\n </v-toolbar>\n <v-data-table\n :items=createItems(clusterCreationResponse.terraformResult.createdResources)\n class=\"elevation-1\"\n hide-actions\n hide-headers\n >\n <template slot=\"items\" slot-scope=\"props\" >\n <td>{{ props.item.name }}</td>\n <td>{{ props.item.value }}</td>\n </template>\n </v-data-table>\n\n <br/>\n\n <v-toolbar flat color=\"white\">\n <v-toolbar-title>Outputs</v-toolbar-title>\n </v-toolbar>\n <v-data-table\n :items=createItems(clusterCreationResponse.terraformResult.outputs)\n class=\"elevation-1\"\n hide-actions\n hide-headers\n >\n <template slot=\"items\" slot-scope=\"props\" >\n <td>{{ props.item.name }}</td>\n <td>{{ props.item.value }}</td>\n </template>\n </v-data-table>\n\n <br/>\n\n </div>\n\n <div v-if=\"terraformFilesDownloaded\">\n <h3>Please unzip the downloaded file, open the file 'README.txt' and follow the instructions.</h3>\n </div>\n\n </v-container>\n</template>\n\n<script>\n export default {\n data() {\n return {\n csp: this.$route.params.csp,\n parameters: this.$route.params.parameters,\n downloadFormsOnly: this.$route.params.downloadFormsOnly,\n clusterCreated: false,\n error: null,\n clusterCreationResponse: null,\n terraformFilesDownloaded: false,\n timer: null,\n loading: false\n }\n },\n watch: {\n '$route'(to) {\n if (to.name === 'create-cluster') {\n this.csp = to.params.csp ? to.params.csp : this.csp;\n this.parameters = to.params.parameters ? to.params.parameters : this.parameters;\n this.downloadFormsOnly = to.params.downloadFormsOnly;\n this.clusterCreated = false;\n this.loading = false;\n this.createCluster(false);\n }\n }\n },\n mounted() {\n this.createCluster(false);\n },\n methods: {\n createCluster(fixedPressed) {\n this.loading = fixedPressed;\n const payload = {\n csp: this.csp.name,\n parameters: this.parameters\n };\n\n if (this.downloadFormsOnly) {\n this.$http.post('cluster/download', payload, {responseType: 'blob'})\n .then(response => {\n return response.blob();\n }).then(blob => {\n const a = document.createElement(\"a\");\n document.body.appendChild(a);\n const url = window.URL.createObjectURL(blob);\n a.href = url;\n a.download = 'cluster.zip';\n a.click();\n window.URL.revokeObjectURL(url);\n a.remove();\n this.terraformFilesDownloaded = true;\n });\n } else {\n this.$http.post('cluster', payload)\n .then(response => {\n console.log(response);\n this.error = null;\n this.timer = setInterval(this.pollForClusterCreationResult, 10000);\n }, response => {\n console.log(response);\n this.error = response.data;\n this.loading = false;\n });\n }\n },\n pollForClusterCreationResult() {\n this.$http.get('cluster/result')\n .then(response => {\n console.log(response);\n this.clusterCreationResponse = response.data;\n if (response.data.status === 'FINISHED') {\n clearInterval(this.timer);\n if (response.data.error) {\n this.error = response.data.error;\n } else {\n this.clusterCreated = true;\n this.error = null;\n }\n }\n }, response => {\n clearInterval(this.timer);\n console.log(response);\n this.error = response.data;\n alert(response.data);\n });\n },\n createItems(jsonObject) {\n const items = [];\n for (let key in jsonObject) {\n items.push({\n name: key,\n value: jsonObject[key]\n });\n }\n console.log(items);\n return items;\n }\n }\n }\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/vuetify-loader/lib/loader.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CreateCluster.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/vuetify-loader/lib/loader.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CreateCluster.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CreateCluster.vue?vue&type=template&id=a30c72d0&\"\nimport script from \"./CreateCluster.vue?vue&type=script&lang=js&\"\nexport * from \"./CreateCluster.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"CreateCluster.vue\"\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib'\nimport { VContainer } from 'vuetify/lib'\nimport { VDataTable } from 'vuetify/lib'\nimport { VProgressCircular } from 'vuetify/lib'\nimport { VProgressLinear } from 'vuetify/lib'\nimport { VToolbar } from 'vuetify/lib'\nimport { VToolbarTitle } from 'vuetify/lib'\ninstallComponents(component, {\n VBtn,\n VContainer,\n VDataTable,\n VProgressCircular,\n VProgressLinear,\n VToolbar,\n VToolbarTitle,\n})\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/core/src/main/resources/setup/js/chunk-2d216bc4.d0c185c1.js b/core/src/main/resources/setup/js/chunk-2d216bc4.d0c185c1.js
new file mode 100644
index 0000000..8d4865d
--- /dev/null
+++ b/core/src/main/resources/setup/js/chunk-2d216bc4.d0c185c1.js
@@ -0,0 +1,2 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d216bc4"],{c474:function(e,t,r){"use strict";r.r(t);var a=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("v-container",{staticClass:"ma-5",attrs:{"grid-list-md":""}},[e.downloadFormsOnly||e.clusterCreated||e.error?e._e():r("div",[r("h3",[e._v("Please wait while Jemo creates the cluster. This can take up to 15 minutes.")]),r("v-progress-linear",{attrs:{indeterminate:!0}}),e.clusterCreationResponse?r("div",[r("pre",[e._v(e._s(e.clusterCreationResponse.output))]),r("div",{staticClass:"pa-3"},[r("v-progress-circular",{attrs:{indeterminate:"",size:16}})],1)]):e._e()],1),e.error?r("div",["TERRAFORM_NOT_INSTALLED"===e.error.code?r("div",[r("h3",[e._v("The server can not find the terraform command.")]),e._v("\n Either terraform is not installed ("),r("a",{attrs:{href:"https://learn.hashicorp.com/terraform/getting-started/install.html",target:"_blank"}},[e._v("Installation\n instructions")]),e._v("),\n or it is not in the path. (e.g. run: terraform -version).\n "),r("br"),r("br"),r("v-btn",{attrs:{color:"primary",loading:e.loading},on:{click:function(t){e.createCluster(!0)}}},[e._v("Fixed")])],1):"KUBECTL_NOT_INSTALLED"===e.error.code?r("div",[r("h3",[e._v("The server can not find the kubectl command.")]),e._v("\n Either kubectl is not installed ("),r("a",{attrs:{href:"https://kubernetes.io/docs/tasks/tools/install-kubectl/",target:"_blank"}},[e._v("Installation\n instructions")]),e._v("),\n or it is not in the path. (e.g. run: kubectl --help).\n "),r("br"),r("br"),r("v-btn",{attrs:{color:"primary",loading:e.loading},on:{click:function(t){e.createCluster(!0)}}},[e._v("Fixed")])],1):r("div",[r("h3",[e._v("Failed to create the cluster. The following error occurred:")]),r("br"),r("pre",[e._v(e._s(e.error.message))]),r("br"),r("v-btn",{attrs:{to:{name:"delete",params:{csp:this.csp,mode:"CLUSTER"}},color:"primary"}},[e._v("Revert")])],1)]):e._e(),e.clusterCreated?r("div",[r("h3",[e._v("Setup Completed")]),r("br"),e._v("\n Great job! The cluster is created.\n "),r("br"),e._v("\n You can access jemo on "),r("a",{attrs:{href:e.clusterCreationResponse.loadBalancerUrl,target:"_blank"}},[e._v(e._s(e.clusterCreationResponse.loadBalancerUrl))]),e._v(".\n You may need to wait 1-2 minutes before accessing it.\n "),r("br"),r("br"),e._v("\n Terraform reported the following created resources and outputs.\n "),r("br"),r("br"),r("v-toolbar",{attrs:{flat:"",color:"white"}},[r("v-toolbar-title",[e._v("Created Resources")])],1),r("v-data-table",{staticClass:"elevation-1",attrs:{items:e.createItems(e.clusterCreationResponse.terraformResult.createdResources),"hide-actions":"","hide-headers":""},scopedSlots:e._u([{key:"items",fn:function(t){return[r("td",[e._v(e._s(t.item.name))]),r("td",[e._v(e._s(t.item.value))])]}}])}),r("br"),r("v-toolbar",{attrs:{flat:"",color:"white"}},[r("v-toolbar-title",[e._v("Outputs")])],1),r("v-data-table",{staticClass:"elevation-1",attrs:{items:e.createItems(e.clusterCreationResponse.terraformResult.outputs),"hide-actions":"","hide-headers":""},scopedSlots:e._u([{key:"items",fn:function(t){return[r("td",[e._v(e._s(t.item.name))]),r("td",[e._v(e._s(t.item.value))])]}}])}),r("br")],1):e._e(),e.terraformFilesDownloaded?r("div",[r("h3",[e._v("Please unzip the downloaded file, open the file 'README.txt' and follow the instructions.")])]):e._e()])},s=[],o=(r("7f7f"),r("cadf"),r("551c"),r("097d"),{data:function(){return{csp:this.$route.params.csp,parameters:this.$route.params.parameters,downloadFormsOnly:this.$route.params.downloadFormsOnly,clusterCreated:!1,error:null,clusterCreationResponse:null,terraformFilesDownloaded:!1,timer:null,loading:!1}},watch:{$route:function(e){"create-cluster"===e.name&&(this.csp=e.params.csp?e.params.csp:this.csp,this.parameters=e.params.parameters?e.params.parameters:this.parameters,this.downloadFormsOnly=e.params.downloadFormsOnly,this.clusterCreated=!1,this.loading=!1,this.createCluster(!1))}},mounted:function(){this.createCluster(!1)},methods:{createCluster:function(e){var t=this;this.loading=e;var r={csp:this.csp.name,parameters:this.parameters};this.downloadFormsOnly?this.$http.post("cluster/download",r,{responseType:"blob"}).then(function(e){return e.blob()}).then(function(e){var r=document.createElement("a");document.body.appendChild(r);var a=window.URL.createObjectURL(e);r.href=a,r.download="cluster.zip",r.click(),window.URL.revokeObjectURL(a),r.remove(),t.terraformFilesDownloaded=!0}):this.$http.post("cluster",r).then(function(e){console.log(e),t.error=null,t.timer=setInterval(t.pollForClusterCreationResult,1e4)},function(e){console.log(e),t.error=e.data,t.loading=!1})},pollForClusterCreationResult:function(){var e=this;this.$http.get("cluster/result").then(function(t){console.log(t),e.clusterCreationResponse=t.data,"FINISHED"===t.data.status&&(clearInterval(e.timer),t.data.error?e.error=t.data.error:(e.clusterCreated=!0,e.error=null))},function(t){clearInterval(e.timer),console.log(t),e.error=t.data,alert(t.data)})},createItems:function(e){var t=[];for(var r in e)t.push({name:r,value:e[r]});return console.log(t),t}}}),n=o,l=r("2877"),i=r("6544"),c=r.n(i),d=r("8336"),u=r("a523"),m=r("8fea"),p=r("490a"),h=r("8e36"),v=r("71d9"),f=r("2a7f"),_=Object(l["a"])(n,a,s,!1,null,null,null);_.options.__file="CreateCluster.vue";t["default"]=_.exports;c()(_,{VBtn:d["a"],VContainer:u["a"],VDataTable:m["a"],VProgressCircular:p["a"],VProgressLinear:h["a"],VToolbar:v["a"],VToolbarTitle:f["a"]})}}]);
+//# sourceMappingURL=chunk-2d216bc4.d0c185c1.js.map
\ No newline at end of file
diff --git a/core/src/main/resources/setup/js/chunk-2d216bc4.d0c185c1.js.map b/core/src/main/resources/setup/js/chunk-2d216bc4.d0c185c1.js.map
new file mode 100644
index 0000000..41f0e04
--- /dev/null
+++ b/core/src/main/resources/setup/js/chunk-2d216bc4.d0c185c1.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///./src/views/CreateCluster.vue?0283","webpack:///src/views/CreateCluster.vue","webpack:///./src/views/CreateCluster.vue?94b9","webpack:///./src/views/CreateCluster.vue"],"names":["render","_vm","this","_h","$createElement","_c","_self","staticClass","attrs","grid-list-md","downloadFormsOnly","clusterCreated","error","_e","_v","indeterminate","_s","clusterCreationResponse","output","size","code","href","target","color","loading","on","click","$event","createCluster","message","to","name","params","csp","mode","loadBalancerUrl","flat","items","createItems","terraformResult","createdResources","hide-actions","hide-headers","scopedSlots","_u","key","fn","props","item","value","outputs","staticRenderFns","CreateClustervue_type_script_lang_js_","data","$route","parameters","terraformFilesDownloaded","timer","watch","mounted","methods","fixedPressed","_this","payload","$http","post","responseType","then","response","blob","a","document","createElement","body","appendChild","url","window","URL","createObjectURL","download","revokeObjectURL","remove","console","log","setInterval","pollForClusterCreationResult","_this2","get","status","clearInterval","alert","jsonObject","push","views_CreateClustervue_type_script_lang_js_","component","Object","componentNormalizer","options","__file","__webpack_exports__","installComponents_default","VBtn","VContainer","VDataTable","VProgressCircular","VProgressLinear","VToolbar","VToolbarTitle","components_VToolbar"],"mappings":"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","file":"js/chunk-2d216bc4.d0c185c1.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-container',{staticClass:\"ma-5\",attrs:{\"grid-list-md\":\"\"}},[(!_vm.downloadFormsOnly && !_vm.clusterCreated && !_vm.error)?_c('div',[_c('h3',[_vm._v(\"Please wait while Jemo creates the cluster. This can take up to 15 minutes.\")]),_c('v-progress-linear',{attrs:{\"indeterminate\":true}}),(_vm.clusterCreationResponse)?_c('div',[_c('pre',[_vm._v(_vm._s(_vm.clusterCreationResponse.output))]),_c('div',{staticClass:\"pa-3\"},[_c('v-progress-circular',{attrs:{\"indeterminate\":\"\",\"size\":16}})],1)]):_vm._e()],1):_vm._e(),(_vm.error)?_c('div',[(_vm.error.code === 'TERRAFORM_NOT_INSTALLED')?_c('div',[_c('h3',[_vm._v(\"The server can not find the terraform command.\")]),_vm._v(\"\\n Either terraform is not installed (\"),_c('a',{attrs:{\"href\":\"https://learn.hashicorp.com/terraform/getting-started/install.html\",\"target\":\"_blank\"}},[_vm._v(\"Installation\\n instructions\")]),_vm._v(\"),\\n or it is not in the path. (e.g. run: terraform -version).\\n \"),_c('br'),_c('br'),_c('v-btn',{attrs:{\"color\":\"primary\",\"loading\":_vm.loading},on:{\"click\":function($event){_vm.createCluster(true)}}},[_vm._v(\"Fixed\")])],1):(_vm.error.code === 'KUBECTL_NOT_INSTALLED')?_c('div',[_c('h3',[_vm._v(\"The server can not find the kubectl command.\")]),_vm._v(\"\\n Either kubectl is not installed (\"),_c('a',{attrs:{\"href\":\"https://kubernetes.io/docs/tasks/tools/install-kubectl/\",\"target\":\"_blank\"}},[_vm._v(\"Installation\\n instructions\")]),_vm._v(\"),\\n or it is not in the path. (e.g. run: kubectl --help).\\n \"),_c('br'),_c('br'),_c('v-btn',{attrs:{\"color\":\"primary\",\"loading\":_vm.loading},on:{\"click\":function($event){_vm.createCluster(true)}}},[_vm._v(\"Fixed\")])],1):_c('div',[_c('h3',[_vm._v(\"Failed to create the cluster. The following error occurred:\")]),_c('br'),_c('pre',[_vm._v(_vm._s(_vm.error.message))]),_c('br'),_c('v-btn',{attrs:{\"to\":{name: 'delete', params: {csp: this.csp, mode: 'CLUSTER'}},\"color\":\"primary\"}},[_vm._v(\"Revert\")])],1)]):_vm._e(),(_vm.clusterCreated)?_c('div',[_c('h3',[_vm._v(\"Setup Completed\")]),_c('br'),_vm._v(\"\\n Great job! The cluster is created.\\n \"),_c('br'),_vm._v(\"\\n You can access jemo on \"),_c('a',{attrs:{\"href\":_vm.clusterCreationResponse.loadBalancerUrl,\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.clusterCreationResponse.loadBalancerUrl))]),_vm._v(\".\\n You may need to wait 1-2 minutes before accessing it.\\n \"),_c('br'),_c('br'),_vm._v(\"\\n Terraform reported the following created resources and outputs.\\n \"),_c('br'),_c('br'),_c('v-toolbar',{attrs:{\"flat\":\"\",\"color\":\"white\"}},[_c('v-toolbar-title',[_vm._v(\"Created Resources\")])],1),_c('v-data-table',{staticClass:\"elevation-1\",attrs:{\"items\":_vm.createItems(_vm.clusterCreationResponse.terraformResult.createdResources),\"hide-actions\":\"\",\"hide-headers\":\"\"},scopedSlots:_vm._u([{key:\"items\",fn:function(props){return [_c('td',[_vm._v(_vm._s(props.item.name))]),_c('td',[_vm._v(_vm._s(props.item.value))])]}}])}),_c('br'),_c('v-toolbar',{attrs:{\"flat\":\"\",\"color\":\"white\"}},[_c('v-toolbar-title',[_vm._v(\"Outputs\")])],1),_c('v-data-table',{staticClass:\"elevation-1\",attrs:{\"items\":_vm.createItems(_vm.clusterCreationResponse.terraformResult.outputs),\"hide-actions\":\"\",\"hide-headers\":\"\"},scopedSlots:_vm._u([{key:\"items\",fn:function(props){return [_c('td',[_vm._v(_vm._s(props.item.name))]),_c('td',[_vm._v(_vm._s(props.item.value))])]}}])}),_c('br')],1):_vm._e(),(_vm.terraformFilesDownloaded)?_c('div',[_c('h3',[_vm._v(\"Please unzip the downloaded file, open the file 'README.txt' and follow the instructions.\")])]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\n <v-container grid-list-md class=\"ma-5\">\n <div v-if=\"!downloadFormsOnly && !clusterCreated && !error\">\n <h3>Please wait while Jemo creates the cluster. This can take up to 15 minutes.</h3>\n <v-progress-linear :indeterminate=\"true\"></v-progress-linear>\n <div v-if=\"clusterCreationResponse\">\n <pre>{{ clusterCreationResponse.output }}</pre>\n <div class=\"pa-3\">\n <v-progress-circular indeterminate :size=\"16\"></v-progress-circular>\n </div>\n </div>\n </div>\n\n <div v-if=\"error\">\n <div v-if=\"error.code === 'TERRAFORM_NOT_INSTALLED'\">\n <h3>The server can not find the terraform command.</h3>\n Either terraform is not installed (<a\n href=\"https://learn.hashicorp.com/terraform/getting-started/install.html\" target=\"_blank\">Installation\n instructions</a>),\n or it is not in the path. (e.g. run: terraform -version).\n <br/>\n <br/>\n <v-btn @click=\"createCluster(true)\" color=\"primary\" :loading=\"loading\">Fixed</v-btn>\n </div>\n <div v-else-if=\"error.code === 'KUBECTL_NOT_INSTALLED'\">\n <h3>The server can not find the kubectl command.</h3>\n Either kubectl is not installed (<a\n href=\"https://kubernetes.io/docs/tasks/tools/install-kubectl/\" target=\"_blank\">Installation\n instructions</a>),\n or it is not in the path. (e.g. run: kubectl --help).\n <br/>\n <br/>\n <v-btn @click=\"createCluster(true)\" color=\"primary\" :loading=\"loading\">Fixed</v-btn>\n </div>\n <div v-else>\n <h3>Failed to create the cluster. The following error occurred:</h3>\n <br/>\n <pre>{{error.message}}</pre>\n\n <br>\n <v-btn :to=\"{name: 'delete', params: {csp: this.csp, mode: 'CLUSTER'}}\" color=\"primary\">Revert</v-btn>\n </div>\n </div>\n\n <div v-if=\"clusterCreated\">\n <h3>Setup Completed</h3>\n <br/>\n Great job! The cluster is created.\n <br/>\n You can access jemo on <a :href=clusterCreationResponse.loadBalancerUrl target=\"_blank\">{{clusterCreationResponse.loadBalancerUrl}}</a>.\n You may need to wait 1-2 minutes before accessing it.\n <br/>\n <br/>\n Terraform reported the following created resources and outputs.\n <br/>\n <br/>\n\n <v-toolbar flat color=\"white\">\n <v-toolbar-title>Created Resources</v-toolbar-title>\n </v-toolbar>\n <v-data-table\n :items=createItems(clusterCreationResponse.terraformResult.createdResources)\n class=\"elevation-1\"\n hide-actions\n hide-headers\n >\n <template slot=\"items\" slot-scope=\"props\" >\n <td>{{ props.item.name }}</td>\n <td>{{ props.item.value }}</td>\n </template>\n </v-data-table>\n\n <br/>\n\n <v-toolbar flat color=\"white\">\n <v-toolbar-title>Outputs</v-toolbar-title>\n </v-toolbar>\n <v-data-table\n :items=createItems(clusterCreationResponse.terraformResult.outputs)\n class=\"elevation-1\"\n hide-actions\n hide-headers\n >\n <template slot=\"items\" slot-scope=\"props\" >\n <td>{{ props.item.name }}</td>\n <td>{{ props.item.value }}</td>\n </template>\n </v-data-table>\n\n <br/>\n\n </div>\n\n <div v-if=\"terraformFilesDownloaded\">\n <h3>Please unzip the downloaded file, open the file 'README.txt' and follow the instructions.</h3>\n </div>\n\n </v-container>\n</template>\n\n<script>\n export default {\n data() {\n return {\n csp: this.$route.params.csp,\n parameters: this.$route.params.parameters,\n downloadFormsOnly: this.$route.params.downloadFormsOnly,\n clusterCreated: false,\n error: null,\n clusterCreationResponse: null,\n terraformFilesDownloaded: false,\n timer: null,\n loading: false\n }\n },\n watch: {\n '$route'(to) {\n if (to.name === 'create-cluster') {\n this.csp = to.params.csp ? to.params.csp : this.csp;\n this.parameters = to.params.parameters ? to.params.parameters : this.parameters;\n this.downloadFormsOnly = to.params.downloadFormsOnly;\n this.clusterCreated = false;\n this.loading = false;\n this.createCluster(false);\n }\n }\n },\n mounted() {\n this.createCluster(false);\n },\n methods: {\n createCluster(fixedPressed) {\n this.loading = fixedPressed;\n const payload = {\n csp: this.csp.name,\n parameters: this.parameters\n };\n\n if (this.downloadFormsOnly) {\n this.$http.post('cluster/download', payload, {responseType: 'blob'})\n .then(response => {\n return response.blob();\n }).then(blob => {\n const a = document.createElement(\"a\");\n document.body.appendChild(a);\n const url = window.URL.createObjectURL(blob);\n a.href = url;\n a.download = 'cluster.zip';\n a.click();\n window.URL.revokeObjectURL(url);\n a.remove();\n this.terraformFilesDownloaded = true;\n });\n } else {\n this.$http.post('cluster', payload)\n .then(response => {\n console.log(response);\n this.error = null;\n this.timer = setInterval(this.pollForClusterCreationResult, 10000);\n }, response => {\n console.log(response);\n this.error = response.data;\n this.loading = false;\n });\n }\n },\n pollForClusterCreationResult() {\n this.$http.get('cluster/result')\n .then(response => {\n console.log(response);\n this.clusterCreationResponse = response.data;\n if (response.data.status === 'FINISHED') {\n clearInterval(this.timer);\n if (response.data.error) {\n this.error = response.data.error;\n } else {\n this.clusterCreated = true;\n this.error = null;\n }\n }\n }, response => {\n clearInterval(this.timer);\n console.log(response);\n this.error = response.data;\n alert(response.data);\n });\n },\n createItems(jsonObject) {\n const items = [];\n for (let key in jsonObject) {\n items.push({\n name: key,\n value: jsonObject[key]\n });\n }\n console.log(items);\n return items;\n }\n }\n }\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/vuetify-loader/lib/loader.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CreateCluster.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/vuetify-loader/lib/loader.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CreateCluster.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CreateCluster.vue?vue&type=template&id=da177706&\"\nimport script from \"./CreateCluster.vue?vue&type=script&lang=js&\"\nexport * from \"./CreateCluster.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"CreateCluster.vue\"\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib'\nimport { VContainer } from 'vuetify/lib'\nimport { VDataTable } from 'vuetify/lib'\nimport { VProgressCircular } from 'vuetify/lib'\nimport { VProgressLinear } from 'vuetify/lib'\nimport { VToolbar } from 'vuetify/lib'\nimport { VToolbarTitle } from 'vuetify/lib'\ninstallComponents(component, {\n VBtn,\n VContainer,\n VDataTable,\n VProgressCircular,\n VProgressLinear,\n VToolbar,\n VToolbarTitle,\n})\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/core/src/main/resources/setup/js/chunk-975357a2.f01b5bb0.js b/core/src/main/resources/setup/js/chunk-975357a2.a9960b1d.js
similarity index 73%
rename from core/src/main/resources/setup/js/chunk-975357a2.f01b5bb0.js
rename to core/src/main/resources/setup/js/chunk-975357a2.a9960b1d.js
index b75bb03..484e07c 100644
--- a/core/src/main/resources/setup/js/chunk-975357a2.f01b5bb0.js
+++ b/core/src/main/resources/setup/js/chunk-975357a2.a9960b1d.js
@@ -1,2 +1,2 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-975357a2"],{"07e3":function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},"0a49":function(t,e,n){var r=n("9b43"),i=n("626a"),a=n("4bf8"),o=n("9def"),s=n("cd1c");t.exports=function(t,e){var n=1==t,c=2==t,l=3==t,u=4==t,d=6==t,f=5==t||d,v=e||s;return function(e,s,h){for(var p,m,y=a(e),g=i(y),b=r(s,h,3),w=o(g.length),x=0,k=n?v(e,w):c?v(e,0):void 0;w>x;x++)if((f||x in g)&&(p=g[x],m=b(p,x,y),t))if(n)k[x]=m;else if(m)switch(t){case 3:return!0;case 5:return p;case 6:return x;case 2:k.push(p)}else if(u)return!1;return d?-1:l||u?u:k}}},"0fc9":function(t,e,n){var r=n("3a38"),i=Math.max,a=Math.min;t.exports=function(t,e){return t=r(t),t<0?i(t+e,0):a(t,e)}},1169:function(t,e,n){var r=n("2d95");t.exports=Array.isArray||function(t){return"Array"==r(t)}},1691:function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},"169a":function(t,e,n){"use strict";n("6ec0");var r=n("c69d"),i=n("30d4"),a=(n("f7dc"),n("80d2")),o={name:"overlayable",props:{hideOverlay:Boolean},data:function(){return{overlay:null,overlayOffset:0,overlayTimeout:null,overlayTransitionDuration:650}},beforeDestroy:function(){this.removeOverlay()},methods:{genOverlay:function(){var t=this;if(!this.isActive||this.hideOverlay||this.isActive&&this.overlayTimeout||this.overlay)return clearTimeout(this.overlayTimeout),this.overlay&&this.overlay.classList.add("v-overlay--active");this.overlay=document.createElement("div"),this.overlay.className="v-overlay",this.absolute&&(this.overlay.className+=" v-overlay--absolute"),this.hideScroll();var e=this.absolute?this.$el.parentNode:document.querySelector("[data-app]");return e&&e.insertBefore(this.overlay,e.firstChild),this.overlay.clientHeight,requestAnimationFrame(function(){t.overlay&&(t.overlay.className+=" v-overlay--active",void 0!==t.activeZIndex&&(t.overlay.style.zIndex=t.activeZIndex-1))}),!0},removeOverlay:function(){var t=this,e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];if(!this.overlay)return e&&this.showScroll();this.overlay.classList.remove("v-overlay--active"),this.overlayTimeout=setTimeout(function(){try{t.overlay&&t.overlay.parentNode&&t.overlay.parentNode.removeChild(t.overlay),t.overlay=null,e&&t.showScroll()}catch(n){console.log(n)}clearTimeout(t.overlayTimeout),t.overlayTimeout=null},this.overlayTransitionDuration)},scrollListener:function(t){if("keydown"===t.type){if(["INPUT","TEXTAREA","SELECT"].includes(t.target.tagName)||t.target.isContentEditable)return;var e=[a["n"].up,a["n"].pageup],n=[a["n"].down,a["n"].pagedown];if(e.includes(t.keyCode))t.deltaY=-1;else{if(!n.includes(t.keyCode))return;t.deltaY=1}}(t.target===this.overlay||"keydown"!==t.type&&t.target===document.body||this.checkPath(t))&&t.preventDefault()},hasScrollbar:function(t){if(!t||t.nodeType!==Node.ELEMENT_NODE)return!1;var e=window.getComputedStyle(t);return["auto","scroll"].includes(e["overflow-y"])&&t.scrollHeight>t.clientHeight},shouldScroll:function(t,e){return 0===t.scrollTop&&e<0||t.scrollTop+t.clientHeight===t.scrollHeight&&e>0},isInside:function(t,e){return t===e||null!==t&&t!==document.body&&this.isInside(t.parentNode,e)},checkPath:function(t){var e=t.path||this.composedPath(t),n=t.deltaY||-t.wheelDelta;if("keydown"===t.type&&e[0]===document.body){var r=this.$refs.dialog,i=window.getSelection().anchorNode;return!this.hasScrollbar(r)||!this.isInside(i,r)||this.shouldScroll(r,n)}for(var a=0;a<e.length;a++){var o=e[a];if(o===document)return!0;if(o===document.documentElement)return!0;if(o===this.$refs.content)return!0;if(this.hasScrollbar(o))return this.shouldScroll(o,n)}return!0},composedPath:function(t){if(t.composedPath)return t.composedPath();var e=[],n=t.target;while(n){if(e.push(n),"HTML"===n.tagName)return e.push(document),e.push(window),e;n=n.parentElement}},hideScroll:function(){this.$vuetify.breakpoint.smAndDown?document.documentElement.classList.add("overflow-y-hidden"):(window.addEventListener("wheel",this.scrollListener),window.addEventListener("keydown",this.scrollListener))},showScroll:function(){document.documentElement.classList.remove("overflow-y-hidden"),window.removeEventListener("wheel",this.scrollListener),window.removeEventListener("keydown",this.scrollListener)}}},s=n("e949"),c=n("261e"),l=n("98a1"),u=n("c584"),d=n("bfc5"),f=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t};function v(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}e["a"]={name:"v-dialog",directives:{ClickOutside:u["a"]},mixins:[r["a"],i["a"],o,s["a"],c["a"],l["a"]],props:{disabled:Boolean,persistent:Boolean,fullscreen:Boolean,fullWidth:Boolean,noClickAnimation:Boolean,light:Boolean,dark:Boolean,maxWidth:{type:[String,Number],default:"none"},origin:{type:String,default:"center center"},width:{type:[String,Number],default:"auto"},scrollable:Boolean,transition:{type:[String,Boolean],default:"dialog-transition"}},data:function(){return{animate:!1,animateTimeout:null,stackClass:"v-dialog__content--active",stackMinZIndex:200}},computed:{classes:function(){var t;return t={},v(t,("v-dialog "+this.contentClass).trim(),!0),v(t,"v-dialog--active",this.isActive),v(t,"v-dialog--persistent",this.persistent),v(t,"v-dialog--fullscreen",this.fullscreen),v(t,"v-dialog--scrollable",this.scrollable),v(t,"v-dialog--animated",this.animate),t},contentClasses:function(){return{"v-dialog__content":!0,"v-dialog__content--active":this.isActive}}},watch:{isActive:function(t){t?(this.show(),this.hideScroll()):(this.removeOverlay(),this.unbind())},fullscreen:function(t){this.isActive&&(t?(this.hideScroll(),this.removeOverlay(!1)):(this.showScroll(),this.genOverlay()))}},beforeMount:function(){var t=this;this.$nextTick(function(){t.isBooted=t.isActive,t.isActive&&t.show()})},beforeDestroy:function(){"undefined"!==typeof window&&this.unbind()},methods:{animateClick:function(){var t=this;this.animate=!1,this.$nextTick(function(){t.animate=!0,clearTimeout(t.animateTimeout),t.animateTimeout=setTimeout(function(){return t.animate=!1},150)})},closeConditional:function(t){return!(this.$refs.content.contains(t.target)||!this.isActive)&&(this.persistent?(this.noClickAnimation||this.overlay!==t.target||this.animateClick(),!1):Object(a["k"])(this.$refs.content)>=this.getMaxZIndex())},hideScroll:function(){this.fullscreen?document.documentElement.classList.add("overflow-y-hidden"):o.methods.hideScroll.call(this)},show:function(){!this.fullscreen&&!this.hideOverlay&&this.genOverlay(),this.$refs.content.focus(),this.$listeners.keydown&&this.bind()},bind:function(){window.addEventListener("keydown",this.onKeydown)},unbind:function(){window.removeEventListener("keydown",this.onKeydown)},onKeydown:function(t){this.$emit("keydown",t)},genActivator:function(){var t=this;if(!this.$slots.activator&&!this.$scopedSlots.activator)return null;var e=this.disabled?{}:{click:function(e){e.stopPropagation(),t.disabled||(t.isActive=!t.isActive)}};if(this.$scopedSlots.activator){var n=this.$scopedSlots.activator({on:e});return this.activatorNode=n,n}return this.$createElement("div",{staticClass:"v-dialog__activator",class:{"v-dialog__activator--disabled":this.disabled},on:e},[this.$slots.activator])}},render:function(t){var e=this,n=[],r={class:this.classes,ref:"dialog",directives:[{name:"click-outside",value:function(){return e.isActive=!1},args:{closeConditional:this.closeConditional,include:this.getOpenDependentElements}},{name:"show",value:this.isActive}],on:{click:function(t){t.stopPropagation()}}};this.fullscreen||(r.style={maxWidth:"none"===this.maxWidth?void 0:Object(a["b"])(this.maxWidth),width:"auto"===this.width?void 0:Object(a["b"])(this.width)}),n.push(this.genActivator());var i=t("div",r,this.showLazyContent(this.$slots.default));return this.transition&&(i=t("transition",{props:{name:this.transition,origin:this.origin}},[i])),n.push(t("div",{class:this.contentClasses,attrs:f({tabIndex:"-1"},this.getScopeIdAttrs()),style:{zIndex:this.activeZIndex},ref:"content"},[this.$createElement(d["a"],{props:{root:!0,light:this.light,dark:this.dark}},[i])])),t("div",{staticClass:"v-dialog__container",style:{display:!this.$slots.activator||this.fullWidth?"block":"inline-block"}},n)}}},"1bc3":function(t,e,n){var r=n("f772");t.exports=function(t,e){if(!r(t))return t;var n,i;if(e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;if("function"==typeof(n=t.valueOf)&&!r(i=n.call(t)))return i;if(!e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},"1ec9":function(t,e,n){var r=n("f772"),i=n("e53d").document,a=r(i)&&r(i.createElement);t.exports=function(t){return a?i.createElement(t):{}}},"241e":function(t,e,n){var r=n("25eb");t.exports=function(t){return Object(r(t))}},"25eb":function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},2677:function(t,e,n){"use strict";var r=n("8654"),i=(n("7e63"),n("d9bd")),a=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t},o={name:"v-textarea",extends:r["a"],props:{autoGrow:Boolean,noResize:Boolean,outline:Boolean,rowHeight:{type:[Number,String],default:24,validator:function(t){return!isNaN(parseFloat(t))}},rows:{type:[Number,String],default:5,validator:function(t){return!isNaN(parseInt(t,10))}}},computed:{classes:function(){return a({"v-textarea":!0,"v-textarea--auto-grow":this.autoGrow,"v-textarea--no-resize":this.noResizeHandle},r["a"].options.computed.classes.call(this,null))},dynamicHeight:function(){return this.autoGrow?this.inputHeight:"auto"},isEnclosed:function(){return this.textarea||r["a"].options.computed.isEnclosed.call(this)},noResizeHandle:function(){return this.noResize||this.autoGrow}},watch:{lazyValue:function(){!this.internalChange&&this.autoGrow&&this.$nextTick(this.calculateInputHeight)}},mounted:function(){var t=this;setTimeout(function(){t.autoGrow&&t.calculateInputHeight()},0),this.autoGrow&&this.noResize&&Object(i["b"])('"no-resize" is now implied when using "auto-grow", and can be removed',this)},methods:{calculateInputHeight:function(){var t=this.$refs.input;if(t){t.style.height=0;var e=t.scrollHeight,n=parseInt(this.rows,10)*parseFloat(this.rowHeight);t.style.height=Math.max(n,e)+"px"}},genInput:function(){var t=r["a"].options.methods.genInput.call(this);return t.tag="textarea",delete t.data.attrs.type,t.data.attrs.rows=this.rows,t},onInput:function(t){r["a"].options.methods.onInput.call(this,t),this.autoGrow&&this.calculateInputHeight()},onKeyDown:function(t){this.isFocused&&13===t.keyCode&&t.stopPropagation(),this.internalChange=!0,this.$emit("keydown",t)}}},s=n("7cf7"),c=n("ab6d");n.d(e,"a",function(){return l});var l={functional:!0,$_wrapperFor:r["a"],props:{textarea:Boolean,multiLine:Boolean},render:function(t,e){var n=e.props,a=e.data,u=e.slots,d=e.parent;Object(c["a"])(a);var f=Object(s["a"])(u(),t);return n.textarea&&Object(i["d"])("<v-text-field textarea>","<v-textarea outline>",l,d),n.multiLine&&Object(i["d"])("<v-text-field multi-line>","<v-textarea>",l,d),n.textarea||n.multiLine?(a.attrs.outline=n.textarea,t(o,a,f)):t(r["a"],a,f)}}},"294c":function(t,e){t.exports=function(t){try{return!!t()}catch(e){return!0}}},"2f21":function(t,e,n){"use strict";var r=n("79e5");t.exports=function(t,e){return!!t&&r(function(){e?t.call(null,function(){},1):t.call(null)})}},"2fdb":function(t,e,n){"use strict";var r=n("5ca1"),i=n("d2c8"),a="includes";r(r.P+r.F*n("5147")(a),"String",{includes:function(t){return!!~i(this,t,a).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},"32a6":function(t,e,n){var r=n("241e"),i=n("c3a1");n("ce7ec")("keys",function(){return function(t){return i(r(t))}})},"335c":function(t,e,n){var r=n("6b4c");t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},"35e8":function(t,e,n){var r=n("d9f6"),i=n("aebd");t.exports=n("8e60")?function(t,e,n){return r.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},"36c3":function(t,e,n){var r=n("335c"),i=n("25eb");t.exports=function(t){return r(i(t))}},"3a38":function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},"4f37":function(t,e,n){"use strict";n("aa77")("trim",function(t){return function(){return t(this,3)}})},5147:function(t,e,n){var r=n("2b4c")("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(i){}}return!0}},5559:function(t,e,n){var r=n("dbdb")("keys"),i=n("62a0");t.exports=function(t){return r[t]||(r[t]=i(t))}},"584a":function(t,e){var n=t.exports={version:"2.6.1"};"number"==typeof __e&&(__e=n)},"5b4e":function(t,e,n){var r=n("36c3"),i=n("b447"),a=n("0fc9");t.exports=function(t){return function(e,n,o){var s,c=r(e),l=i(c.length),u=a(o,l);if(t&&n!=n){while(l>u)if(s=c[u++],s!=s)return!0}else for(;l>u;u++)if((t||u in c)&&c[u]===n)return t||u||0;return!t&&-1}}},"62a0":function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},"63b6":function(t,e,n){var r=n("e53d"),i=n("584a"),a=n("d864"),o=n("35e8"),s=n("07e3"),c="prototype",l=function(t,e,n){var u,d,f,v=t&l.F,h=t&l.G,p=t&l.S,m=t&l.P,y=t&l.B,g=t&l.W,b=h?i:i[e]||(i[e]={}),w=b[c],x=h?r:p?r[e]:(r[e]||{})[c];for(u in h&&(n=e),n)d=!v&&x&&void 0!==x[u],d&&s(b,u)||(f=d?x[u]:n[u],b[u]=h&&"function"!=typeof x[u]?n[u]:y&&d?a(f,r):g&&x[u]==f?function(t){var e=function(e,n,r){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,n)}return new t(e,n,r)}return t.apply(this,arguments)};return e[c]=t[c],e}(f):m&&"function"==typeof f?a(Function.call,f):f,m&&((b.virtual||(b.virtual={}))[u]=f,t&l.R&&w&&!w[u]&&o(w,u,f)))};l.F=1,l.G=2,l.S=4,l.P=8,l.B=16,l.W=32,l.U=64,l.R=128,t.exports=l},6762:function(t,e,n){"use strict";var r=n("5ca1"),i=n("c366")(!0);r(r.P,"Array",{includes:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),n("9c6c")("includes")},"6b4c":function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},"6d67":function(t,e,n){"use strict";var r=n("5ca1"),i=n("0a49")(1);r(r.P+r.F*!n("2f21")([].map,!0),"Array",{map:function(t){return i(this,t,arguments[1])}})},"6ec0":function(t,e,n){},7514:function(t,e,n){"use strict";var r=n("5ca1"),i=n("0a49")(5),a="find",o=!0;a in[]&&Array(1)[a](function(){o=!1}),r(r.P+r.F*o,"Array",{find:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),n("9c6c")(a)},"794b":function(t,e,n){t.exports=!n("8e60")&&!n("294c")(function(){return 7!=Object.defineProperty(n("1ec9")("div"),"a",{get:function(){return 7}}).a})},"79aa":function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},"7e63":function(t,e,n){},"8aae":function(t,e,n){n("32a6"),t.exports=n("584a").Object.keys},"8e60":function(t,e,n){t.exports=!n("294c")(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},a4bb:function(t,e,n){t.exports=n("8aae")},aa77:function(t,e,n){var r=n("5ca1"),i=n("be13"),a=n("79e5"),o=n("fdef"),s="["+o+"]",c="
",l=RegExp("^"+s+s+"*"),u=RegExp(s+s+"*$"),d=function(t,e,n){var i={},s=a(function(){return!!o[t]()||c[t]()!=c}),l=i[t]=s?e(f):o[t];n&&(i[n]=l),r(r.P+r.F*s,"String",i)},f=d.trim=function(t,e){return t=String(i(t)),1&e&&(t=t.replace(l,"")),2&e&&(t=t.replace(u,"")),t};t.exports=d},aae3:function(t,e,n){var r=n("d3f4"),i=n("2d95"),a=n("2b4c")("match");t.exports=function(t){var e;return r(t)&&(void 0!==(e=t[a])?!!e:"RegExp"==i(t))}},ac6a:function(t,e,n){for(var r=n("cadf"),i=n("0d58"),a=n("2aba"),o=n("7726"),s=n("32e9"),c=n("84f2"),l=n("2b4c"),u=l("iterator"),d=l("toStringTag"),f=c.Array,v={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},h=i(v),p=0;p<h.length;p++){var m,y=h[p],g=v[y],b=o[y],w=b&&b.prototype;if(w&&(w[u]||s(w,u,f),w[d]||s(w,d,y),c[y]=f,g))for(m in r)w[m]||a(w,m,r[m],!0)}},aebd:function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},b447:function(t,e,n){var r=n("3a38"),i=Math.min;t.exports=function(t){return t>0?i(r(t),9007199254740991):0}},b8e3:function(t,e){t.exports=!0},c3a1:function(t,e,n){var r=n("e6f3"),i=n("1691");t.exports=Object.keys||function(t){return r(t,i)}},cd1c:function(t,e,n){var r=n("e853");t.exports=function(t,e){return new(r(t))(e)}},ce7ec:function(t,e,n){var r=n("63b6"),i=n("584a"),a=n("294c");t.exports=function(t,e){var n=(i.Object||{})[t]||Object[t],o={};o[t]=e(n),r(r.S+r.F*a(function(){n(1)}),"Object",o)}},d2c8:function(t,e,n){var r=n("aae3"),i=n("be13");t.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return String(i(t))}},d864:function(t,e,n){var r=n("79aa");t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}return function(){return t.apply(e,arguments)}}},d9f6:function(t,e,n){var r=n("e4ae"),i=n("794b"),a=n("1bc3"),o=Object.defineProperty;e.f=n("8e60")?Object.defineProperty:function(t,e,n){if(r(t),e=a(e,!0),r(n),i)try{return o(t,e,n)}catch(s){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},dbdb:function(t,e,n){var r=n("584a"),i=n("e53d"),a="__core-js_shared__",o=i[a]||(i[a]={});(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:r.version,mode:n("b8e3")?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},e4ae:function(t,e,n){var r=n("f772");t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},e53d:function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},e6f3:function(t,e,n){var r=n("07e3"),i=n("36c3"),a=n("5b4e")(!1),o=n("5559")("IE_PROTO");t.exports=function(t,e){var n,s=i(t),c=0,l=[];for(n in s)n!=o&&r(s,n)&&l.push(n);while(e.length>c)r(s,n=e[c++])&&(~a(l,n)||l.push(n));return l}},e853:function(t,e,n){var r=n("d3f4"),i=n("1169"),a=n("2b4c")("species");t.exports=function(t){var e;return i(t)&&(e=t.constructor,"function"!=typeof e||e!==Array&&!i(e.prototype)||(e=void 0),r(e)&&(e=e[a],null===e&&(e=void 0))),void 0===e?Array:e}},f3e2:function(t,e,n){"use strict";var r=n("5ca1"),i=n("0a49")(0),a=n("2f21")([].forEach,!0);r(r.P+r.F*!a,"Array",{forEach:function(t){return i(this,t,arguments[1])}})},f4c7:function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.params?n("v-container",{attrs:{"grid-list-md":""}},[n("v-layout",{attrs:{row:"",wrap:""}},[n("v-card",{staticClass:"text-md-center ma-3"},[n("v-card-title",{attrs:{"primary-title":""}},[n("div",[n("h3",{staticClass:"headline mb-0"},[t._v("\n Please review cluster parameter values\n ")])])]),n("v-divider"),n("v-subheader",[t._v("Cluster master parameters")]),n("v-card-text",t._l(t.params.master,function(e){return n("div",{key:e.name},[e.range?n("v-select",{attrs:{items:e.range,label:t.createLabel(e)},model:{value:e.value,callback:function(n){t.$set(e,"value",n)},expression:"param.value"}}):n("v-text-field",{attrs:{label:t.createLabel(e),required:""},model:{value:e.value,callback:function(n){t.$set(e,"value",n)},expression:"param.value"}})],1)}),0),n("v-divider"),n("v-subheader",[t._v("Cluster nodes parameters")]),n("v-card-text",t._l(t.params.nodes,function(e){return n("div",{key:e.name},[e.range?n("v-select",{attrs:{items:e.range,label:t.createLabel(e)},model:{value:e.value,callback:function(n){t.$set(e,"value",n)},expression:"param.value"}}):n("v-text-field",{attrs:{label:t.createLabel(e),required:""},model:{value:e.value,callback:function(n){t.$set(e,"value",n)},expression:"param.value"}})],1)}),0),t.policies?n("div",[n("v-divider"),n("v-subheader",[t._v("Policy to attach to cluster and worker nodes")]),n("v-card-text",[n("v-select",{attrs:{items:t.policies,label:"Existing Policies"},on:{input:function(e){t.changeRoute()}},model:{value:t.selectedPolicy,callback:function(e){t.selectedPolicy=e},expression:"selectedPolicy"}})],1)],1):t._e(),n("v-divider"),n("v-subheader",[t._v("Network parameters")]),t.existingNetworks?n("v-card-text",[n("v-select",{attrs:{items:t.existingNetworks,label:"Existing Networks"},model:{value:t.selectedNetwork,callback:function(e){t.selectedNetwork=e},expression:"selectedNetwork"}}),n("v-btn",{attrs:{color:"primary"},on:{click:function(e){t.existingNetworks=null}}},[t._v("Or Select new network")])],1):n("v-card-text",[t._l(t.params.network,function(e){return n("div",{key:e.name},[n("v-text-field",{attrs:{label:t.createLabel(e),required:""},model:{value:e.value,callback:function(n){t.$set(e,"value",n)},expression:"param.value"}})],1)}),n("v-btn",{attrs:{color:"primary"},on:{click:t.getExistingNetworks}},[t._v("Or Select existing network")])],2),n("v-divider"),n("v-subheader",[t._v("Map containers to parameter sets")]),n("v-card-text",t._l(t.instanceParamSets,function(e,r){return n("v-text-field",{key:r,attrs:{label:t.createReplicasLabel(r),required:""},model:{value:t.instanceParamSets[r],callback:function(e){t.$set(t.instanceParamSets,r,e)},expression:"instanceParamSets[key]"}})}),1),n("v-card-actions",[n("v-layout",{attrs:{row:"","justify-center":""}},[n("v-dialog",{staticClass:"mx-1",attrs:{persistent:"","max-width":"600px"},model:{value:t.permissions_error_dialog,callback:function(e){t.permissions_error_dialog=e},expression:"permissions_error_dialog"}},[n("v-btn",{attrs:{slot:"activator",color:"primary",dark:""},slot:"activator"},[t._v("Create Cluster")]),n("v-card",[n("v-card-title",[n("span",{staticClass:"headline"},[t._v("Terraform user credentials")])]),n("v-card-text",[n("v-container",{attrs:{"grid-list-md":""}},[n("v-layout",{attrs:{wrap:""}},t._l(t.csp.requiredCredentials,function(e){return n("v-flex",{key:e,attrs:{xs12:""}},[n("v-text-field",{attrs:{label:e},model:{value:t.credentialParameters[e],callback:function(n){t.$set(t.credentialParameters,e,n)},expression:"credentialParameters[credential]"}})],1)}),1)],1)],1),n("v-card-actions",[n("v-spacer"),n("v-btn",{attrs:{color:"blue darken-1",flat:""},on:{click:function(e){t.permissions_error_dialog=!1}}},[t._v("Cancel")]),n("v-btn",{attrs:{color:"blue darken-1",flat:""},on:{click:t.validateCredentials}},[t._v("OK")])],1)],1)],1),n("v-btn",{attrs:{color:"secondary"},on:{click:function(e){t.deployCluster(!0)}}},[t._v("Download Terraform Templates")])],1)],1)],1),t.clusterCreated?n("div",[n("h3",[t._v("Cluster created")]),t._v("\n Great job! The cluster is created. Terraform has created the following resources:\n "),n("br"),n("div",[n("pre",[t._v(t._s(t._f("pretty")(t.terraformResult)))])])]):t._e()],1),n("v-dialog",{attrs:{persistent:"","max-width":"600"},model:{value:t.policyValidationErrorDialog,callback:function(e){t.policyValidationErrorDialog=e},expression:"policyValidationErrorDialog"}},[n("v-card",[n("v-card-title",{staticClass:"headline"},[t._v("Policy '"+t._s(t.selectedPolicy)+"' does not have the required permissions\n ")]),n("v-card-text",[t._v("Please select another policy or add to '"+t._s(t.selectedPolicy)+"' the following permissions:\n ")]),n("v-list",{attrs:{dense:""}},t._l(t.policyValidationError,function(e){return n("v-list-tile",{key:e},[n("v-list-tile-content",[n("v-list-tile-title",{domProps:{textContent:t._s(e)}})],1)],1)}),1),n("v-card-actions",[n("v-spacer"),n("v-btn",{attrs:{color:"green darken-1",flat:""},on:{click:function(e){t.policyValidationErrorDialog=!1}}},[t._v("Close")])],1)],1)],1)],1):t._e()},i=[],a=(n("ac6a"),n("f3e2"),n("6762"),n("2fdb"),n("4f37"),n("7514"),n("a4bb")),o=n.n(a),s=(n("6d67"),n("7f7f"),n("cadf"),n("551c"),n("097d"),{data:function(){return{csp:this.$route.params.csp,paramSets:this.$route.params.paramSets,valid:!0,clusterCreated:!1,terraformResult:null,permissions_error_dialog:!1,existingNetworks:null,selectedNetwork:null,policies:null,selectedPolicy:null,policyValidationErrorDialog:!1,policyValidationError:[],credentialParameters:{},params:null,instanceParamSets:{}}},methods:{createLabel:function(t){return t.name+" ("+t.description+")"},createReplicasLabel:function(t){return"Number of containers using "+t},getExistingNetworks:function(){var t=this;this.$http.get("networks/"+this.csp.name).then(function(e){console.log(e),t.existingNetworks=e.data},function(t){console.log(t),alert(t.data)})},validateCredentials:function(){var t=this;this.credentialParameters["region"]=this.csp.region;var e={csp:this.csp.name,parameters:this.credentialParameters};console.log(e),this.$http.post("credentials",e).then(function(e){console.log(e),t.permissions_error_dialog=!1,t.deployCluster(!1)},function(t){console.log(t),alert(t.data)})},changeRoute:function(){var t=this;console.log(this.selectedPolicy);var e={csp:this.csp.name,parameters:{policy:this.selectedPolicy}};this.$http.post("policy/validate",e).then(function(e){console.log(e.data),e.data.notAllowedActions.length>0&&(t.policyValidationErrorDialog=!0,t.policyValidationError=e.data.notAllowedActions)},function(t){alert(t.data)})},deployCluster:function(t){var e=this,n={};for(var r in this.params.master){var i=this.params.master[r];n[i.name]=i.value}for(var a in this.params.nodes){var s=this.params.nodes[a];n[s.name]=s.value}if(this.selectedNetwork)n["existing-network-name"]=this.selectedNetwork;else for(var c in this.params.network){var l=this.params.network[c];n[l.name]=l.value}var u=o()(this.instanceParamSets).map(function(t){return t+":"+e.instanceParamSets[t]}).join(",");n["containersPerParamSet"]=u,this.selectedPolicy&&(n["jemo-policy-name"]=this.selectedPolicy),this.$router.push({name:"create-cluster",params:{csp:this.csp,parameters:n,downloadFormsOnly:t}})},init:function(){var t=this;this.$http.get("cluster/params/"+this.csp.name).then(function(e){console.log(e),t.params=e.data;var n=t.params.master.find(function(t){return"workstation-external-cidr"===t.name});n&&t.$http.get("https://ipv4.icanhazip.com").then(function(t){console.log(t),n.value=t.data.trim()+"/32"},function(t){console.log("Can not find local ip"),console.log(t)})},function(t){console.log(t)}),this.$http.get("policy/"+this.csp.name).then(function(e){console.log(e),t.policies=e.data,t.policies&&t.policies.includes("jemo-policy")&&(t.selectedPolicy="jemo-policy")},function(t){console.log(t)}),this.paramSets.forEach(function(e){return t.instanceParamSets[e.name]=0})}},created:function(){this.init()},watch:{$route:function(t){var e=this;"prod-conf"===t.name&&(this.csp=t.params.csp?t.params.csp:this.csp,this.paramSets=t.params.paramSets?t.params.paramSets:this.paramSets,t.params.csp.name!==this.csp.name?this.init():this.paramSets.forEach(function(t){return e.instanceParamSets[t.name]=0}))}}}),c=s,l=n("2877"),u=n("6544"),d=n.n(u),f=n("8336"),v=n("b0af"),h=n("99d9"),p=n("12b2"),m=n("a523"),y=n("169a"),g=n("ce7e"),b=n("0e8f"),w=n("a722"),x=n("8860"),k=n("ba95"),S=n("5d23"),_=n("b56d"),P=n("9910"),L=n("e0c7"),C=n("2677"),T=Object(l["a"])(c,r,i,!1,null,null,null);T.options.__file="ProdConf.vue";e["default"]=T.exports;d()(T,{VBtn:f["a"],VCard:v["a"],VCardActions:h["a"],VCardText:h["b"],VCardTitle:p["a"],VContainer:m["a"],VDialog:y["a"],VDivider:g["a"],VFlex:b["a"],VLayout:w["a"],VList:x["a"],VListTile:k["a"],VListTileContent:S["a"],VListTileTitle:S["b"],VSelect:_["a"],VSpacer:P["a"],VSubheader:L["a"],VTextField:C["a"]})},f772:function(t,e){t.exports=function(t){return"object"===typeof t?null!==t:"function"===typeof t}},f7dc:function(t,e,n){},fdef:function(t,e){t.exports="\t\n\v\f\r \u2028\u2029\ufeff"}}]);
-//# sourceMappingURL=chunk-975357a2.f01b5bb0.js.map
\ No newline at end of file
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-975357a2"],{"07e3":function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},"0a49":function(t,e,n){var r=n("9b43"),i=n("626a"),a=n("4bf8"),o=n("9def"),s=n("cd1c");t.exports=function(t,e){var n=1==t,c=2==t,l=3==t,u=4==t,d=6==t,f=5==t||d,v=e||s;return function(e,s,h){for(var p,m,y=a(e),g=i(y),b=r(s,h,3),w=o(g.length),x=0,k=n?v(e,w):c?v(e,0):void 0;w>x;x++)if((f||x in g)&&(p=g[x],m=b(p,x,y),t))if(n)k[x]=m;else if(m)switch(t){case 3:return!0;case 5:return p;case 6:return x;case 2:k.push(p)}else if(u)return!1;return d?-1:l||u?u:k}}},"0fc9":function(t,e,n){var r=n("3a38"),i=Math.max,a=Math.min;t.exports=function(t,e){return t=r(t),t<0?i(t+e,0):a(t,e)}},1169:function(t,e,n){var r=n("2d95");t.exports=Array.isArray||function(t){return"Array"==r(t)}},1691:function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},"169a":function(t,e,n){"use strict";n("6ec0");var r=n("c69d"),i=n("30d4"),a=(n("f7dc"),n("80d2")),o={name:"overlayable",props:{hideOverlay:Boolean},data:function(){return{overlay:null,overlayOffset:0,overlayTimeout:null,overlayTransitionDuration:650}},beforeDestroy:function(){this.removeOverlay()},methods:{genOverlay:function(){var t=this;if(!this.isActive||this.hideOverlay||this.isActive&&this.overlayTimeout||this.overlay)return clearTimeout(this.overlayTimeout),this.overlay&&this.overlay.classList.add("v-overlay--active");this.overlay=document.createElement("div"),this.overlay.className="v-overlay",this.absolute&&(this.overlay.className+=" v-overlay--absolute"),this.hideScroll();var e=this.absolute?this.$el.parentNode:document.querySelector("[data-app]");return e&&e.insertBefore(this.overlay,e.firstChild),this.overlay.clientHeight,requestAnimationFrame(function(){t.overlay&&(t.overlay.className+=" v-overlay--active",void 0!==t.activeZIndex&&(t.overlay.style.zIndex=t.activeZIndex-1))}),!0},removeOverlay:function(){var t=this,e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];if(!this.overlay)return e&&this.showScroll();this.overlay.classList.remove("v-overlay--active"),this.overlayTimeout=setTimeout(function(){try{t.overlay&&t.overlay.parentNode&&t.overlay.parentNode.removeChild(t.overlay),t.overlay=null,e&&t.showScroll()}catch(n){console.log(n)}clearTimeout(t.overlayTimeout),t.overlayTimeout=null},this.overlayTransitionDuration)},scrollListener:function(t){if("keydown"===t.type){if(["INPUT","TEXTAREA","SELECT"].includes(t.target.tagName)||t.target.isContentEditable)return;var e=[a["n"].up,a["n"].pageup],n=[a["n"].down,a["n"].pagedown];if(e.includes(t.keyCode))t.deltaY=-1;else{if(!n.includes(t.keyCode))return;t.deltaY=1}}(t.target===this.overlay||"keydown"!==t.type&&t.target===document.body||this.checkPath(t))&&t.preventDefault()},hasScrollbar:function(t){if(!t||t.nodeType!==Node.ELEMENT_NODE)return!1;var e=window.getComputedStyle(t);return["auto","scroll"].includes(e["overflow-y"])&&t.scrollHeight>t.clientHeight},shouldScroll:function(t,e){return 0===t.scrollTop&&e<0||t.scrollTop+t.clientHeight===t.scrollHeight&&e>0},isInside:function(t,e){return t===e||null!==t&&t!==document.body&&this.isInside(t.parentNode,e)},checkPath:function(t){var e=t.path||this.composedPath(t),n=t.deltaY||-t.wheelDelta;if("keydown"===t.type&&e[0]===document.body){var r=this.$refs.dialog,i=window.getSelection().anchorNode;return!this.hasScrollbar(r)||!this.isInside(i,r)||this.shouldScroll(r,n)}for(var a=0;a<e.length;a++){var o=e[a];if(o===document)return!0;if(o===document.documentElement)return!0;if(o===this.$refs.content)return!0;if(this.hasScrollbar(o))return this.shouldScroll(o,n)}return!0},composedPath:function(t){if(t.composedPath)return t.composedPath();var e=[],n=t.target;while(n){if(e.push(n),"HTML"===n.tagName)return e.push(document),e.push(window),e;n=n.parentElement}},hideScroll:function(){this.$vuetify.breakpoint.smAndDown?document.documentElement.classList.add("overflow-y-hidden"):(window.addEventListener("wheel",this.scrollListener),window.addEventListener("keydown",this.scrollListener))},showScroll:function(){document.documentElement.classList.remove("overflow-y-hidden"),window.removeEventListener("wheel",this.scrollListener),window.removeEventListener("keydown",this.scrollListener)}}},s=n("e949"),c=n("261e"),l=n("98a1"),u=n("c584"),d=n("bfc5"),f=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t};function v(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}e["a"]={name:"v-dialog",directives:{ClickOutside:u["a"]},mixins:[r["a"],i["a"],o,s["a"],c["a"],l["a"]],props:{disabled:Boolean,persistent:Boolean,fullscreen:Boolean,fullWidth:Boolean,noClickAnimation:Boolean,light:Boolean,dark:Boolean,maxWidth:{type:[String,Number],default:"none"},origin:{type:String,default:"center center"},width:{type:[String,Number],default:"auto"},scrollable:Boolean,transition:{type:[String,Boolean],default:"dialog-transition"}},data:function(){return{animate:!1,animateTimeout:null,stackClass:"v-dialog__content--active",stackMinZIndex:200}},computed:{classes:function(){var t;return t={},v(t,("v-dialog "+this.contentClass).trim(),!0),v(t,"v-dialog--active",this.isActive),v(t,"v-dialog--persistent",this.persistent),v(t,"v-dialog--fullscreen",this.fullscreen),v(t,"v-dialog--scrollable",this.scrollable),v(t,"v-dialog--animated",this.animate),t},contentClasses:function(){return{"v-dialog__content":!0,"v-dialog__content--active":this.isActive}}},watch:{isActive:function(t){t?(this.show(),this.hideScroll()):(this.removeOverlay(),this.unbind())},fullscreen:function(t){this.isActive&&(t?(this.hideScroll(),this.removeOverlay(!1)):(this.showScroll(),this.genOverlay()))}},beforeMount:function(){var t=this;this.$nextTick(function(){t.isBooted=t.isActive,t.isActive&&t.show()})},beforeDestroy:function(){"undefined"!==typeof window&&this.unbind()},methods:{animateClick:function(){var t=this;this.animate=!1,this.$nextTick(function(){t.animate=!0,clearTimeout(t.animateTimeout),t.animateTimeout=setTimeout(function(){return t.animate=!1},150)})},closeConditional:function(t){return!(this.$refs.content.contains(t.target)||!this.isActive)&&(this.persistent?(this.noClickAnimation||this.overlay!==t.target||this.animateClick(),!1):Object(a["k"])(this.$refs.content)>=this.getMaxZIndex())},hideScroll:function(){this.fullscreen?document.documentElement.classList.add("overflow-y-hidden"):o.methods.hideScroll.call(this)},show:function(){!this.fullscreen&&!this.hideOverlay&&this.genOverlay(),this.$refs.content.focus(),this.$listeners.keydown&&this.bind()},bind:function(){window.addEventListener("keydown",this.onKeydown)},unbind:function(){window.removeEventListener("keydown",this.onKeydown)},onKeydown:function(t){this.$emit("keydown",t)},genActivator:function(){var t=this;if(!this.$slots.activator&&!this.$scopedSlots.activator)return null;var e=this.disabled?{}:{click:function(e){e.stopPropagation(),t.disabled||(t.isActive=!t.isActive)}};if(this.$scopedSlots.activator){var n=this.$scopedSlots.activator({on:e});return this.activatorNode=n,n}return this.$createElement("div",{staticClass:"v-dialog__activator",class:{"v-dialog__activator--disabled":this.disabled},on:e},[this.$slots.activator])}},render:function(t){var e=this,n=[],r={class:this.classes,ref:"dialog",directives:[{name:"click-outside",value:function(){return e.isActive=!1},args:{closeConditional:this.closeConditional,include:this.getOpenDependentElements}},{name:"show",value:this.isActive}],on:{click:function(t){t.stopPropagation()}}};this.fullscreen||(r.style={maxWidth:"none"===this.maxWidth?void 0:Object(a["b"])(this.maxWidth),width:"auto"===this.width?void 0:Object(a["b"])(this.width)}),n.push(this.genActivator());var i=t("div",r,this.showLazyContent(this.$slots.default));return this.transition&&(i=t("transition",{props:{name:this.transition,origin:this.origin}},[i])),n.push(t("div",{class:this.contentClasses,attrs:f({tabIndex:"-1"},this.getScopeIdAttrs()),style:{zIndex:this.activeZIndex},ref:"content"},[this.$createElement(d["a"],{props:{root:!0,light:this.light,dark:this.dark}},[i])])),t("div",{staticClass:"v-dialog__container",style:{display:!this.$slots.activator||this.fullWidth?"block":"inline-block"}},n)}}},"1bc3":function(t,e,n){var r=n("f772");t.exports=function(t,e){if(!r(t))return t;var n,i;if(e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;if("function"==typeof(n=t.valueOf)&&!r(i=n.call(t)))return i;if(!e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},"1ec9":function(t,e,n){var r=n("f772"),i=n("e53d").document,a=r(i)&&r(i.createElement);t.exports=function(t){return a?i.createElement(t):{}}},"241e":function(t,e,n){var r=n("25eb");t.exports=function(t){return Object(r(t))}},"25eb":function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},2677:function(t,e,n){"use strict";var r=n("8654"),i=(n("7e63"),n("d9bd")),a=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t},o={name:"v-textarea",extends:r["a"],props:{autoGrow:Boolean,noResize:Boolean,outline:Boolean,rowHeight:{type:[Number,String],default:24,validator:function(t){return!isNaN(parseFloat(t))}},rows:{type:[Number,String],default:5,validator:function(t){return!isNaN(parseInt(t,10))}}},computed:{classes:function(){return a({"v-textarea":!0,"v-textarea--auto-grow":this.autoGrow,"v-textarea--no-resize":this.noResizeHandle},r["a"].options.computed.classes.call(this,null))},dynamicHeight:function(){return this.autoGrow?this.inputHeight:"auto"},isEnclosed:function(){return this.textarea||r["a"].options.computed.isEnclosed.call(this)},noResizeHandle:function(){return this.noResize||this.autoGrow}},watch:{lazyValue:function(){!this.internalChange&&this.autoGrow&&this.$nextTick(this.calculateInputHeight)}},mounted:function(){var t=this;setTimeout(function(){t.autoGrow&&t.calculateInputHeight()},0),this.autoGrow&&this.noResize&&Object(i["b"])('"no-resize" is now implied when using "auto-grow", and can be removed',this)},methods:{calculateInputHeight:function(){var t=this.$refs.input;if(t){t.style.height=0;var e=t.scrollHeight,n=parseInt(this.rows,10)*parseFloat(this.rowHeight);t.style.height=Math.max(n,e)+"px"}},genInput:function(){var t=r["a"].options.methods.genInput.call(this);return t.tag="textarea",delete t.data.attrs.type,t.data.attrs.rows=this.rows,t},onInput:function(t){r["a"].options.methods.onInput.call(this,t),this.autoGrow&&this.calculateInputHeight()},onKeyDown:function(t){this.isFocused&&13===t.keyCode&&t.stopPropagation(),this.internalChange=!0,this.$emit("keydown",t)}}},s=n("7cf7"),c=n("ab6d");n.d(e,"a",function(){return l});var l={functional:!0,$_wrapperFor:r["a"],props:{textarea:Boolean,multiLine:Boolean},render:function(t,e){var n=e.props,a=e.data,u=e.slots,d=e.parent;Object(c["a"])(a);var f=Object(s["a"])(u(),t);return n.textarea&&Object(i["d"])("<v-text-field textarea>","<v-textarea outline>",l,d),n.multiLine&&Object(i["d"])("<v-text-field multi-line>","<v-textarea>",l,d),n.textarea||n.multiLine?(a.attrs.outline=n.textarea,t(o,a,f)):t(r["a"],a,f)}}},"294c":function(t,e){t.exports=function(t){try{return!!t()}catch(e){return!0}}},"2f21":function(t,e,n){"use strict";var r=n("79e5");t.exports=function(t,e){return!!t&&r(function(){e?t.call(null,function(){},1):t.call(null)})}},"2fdb":function(t,e,n){"use strict";var r=n("5ca1"),i=n("d2c8"),a="includes";r(r.P+r.F*n("5147")(a),"String",{includes:function(t){return!!~i(this,t,a).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},"32a6":function(t,e,n){var r=n("241e"),i=n("c3a1");n("ce7ec")("keys",function(){return function(t){return i(r(t))}})},"335c":function(t,e,n){var r=n("6b4c");t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},"35e8":function(t,e,n){var r=n("d9f6"),i=n("aebd");t.exports=n("8e60")?function(t,e,n){return r.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},"36c3":function(t,e,n){var r=n("335c"),i=n("25eb");t.exports=function(t){return r(i(t))}},"3a38":function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},"4f37":function(t,e,n){"use strict";n("aa77")("trim",function(t){return function(){return t(this,3)}})},5147:function(t,e,n){var r=n("2b4c")("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(i){}}return!0}},5559:function(t,e,n){var r=n("dbdb")("keys"),i=n("62a0");t.exports=function(t){return r[t]||(r[t]=i(t))}},"584a":function(t,e){var n=t.exports={version:"2.6.1"};"number"==typeof __e&&(__e=n)},"5b4e":function(t,e,n){var r=n("36c3"),i=n("b447"),a=n("0fc9");t.exports=function(t){return function(e,n,o){var s,c=r(e),l=i(c.length),u=a(o,l);if(t&&n!=n){while(l>u)if(s=c[u++],s!=s)return!0}else for(;l>u;u++)if((t||u in c)&&c[u]===n)return t||u||0;return!t&&-1}}},"62a0":function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},"63b6":function(t,e,n){var r=n("e53d"),i=n("584a"),a=n("d864"),o=n("35e8"),s=n("07e3"),c="prototype",l=function(t,e,n){var u,d,f,v=t&l.F,h=t&l.G,p=t&l.S,m=t&l.P,y=t&l.B,g=t&l.W,b=h?i:i[e]||(i[e]={}),w=b[c],x=h?r:p?r[e]:(r[e]||{})[c];for(u in h&&(n=e),n)d=!v&&x&&void 0!==x[u],d&&s(b,u)||(f=d?x[u]:n[u],b[u]=h&&"function"!=typeof x[u]?n[u]:y&&d?a(f,r):g&&x[u]==f?function(t){var e=function(e,n,r){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,n)}return new t(e,n,r)}return t.apply(this,arguments)};return e[c]=t[c],e}(f):m&&"function"==typeof f?a(Function.call,f):f,m&&((b.virtual||(b.virtual={}))[u]=f,t&l.R&&w&&!w[u]&&o(w,u,f)))};l.F=1,l.G=2,l.S=4,l.P=8,l.B=16,l.W=32,l.U=64,l.R=128,t.exports=l},6762:function(t,e,n){"use strict";var r=n("5ca1"),i=n("c366")(!0);r(r.P,"Array",{includes:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),n("9c6c")("includes")},"6b4c":function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},"6d67":function(t,e,n){"use strict";var r=n("5ca1"),i=n("0a49")(1);r(r.P+r.F*!n("2f21")([].map,!0),"Array",{map:function(t){return i(this,t,arguments[1])}})},"6ec0":function(t,e,n){},7514:function(t,e,n){"use strict";var r=n("5ca1"),i=n("0a49")(5),a="find",o=!0;a in[]&&Array(1)[a](function(){o=!1}),r(r.P+r.F*o,"Array",{find:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),n("9c6c")(a)},"794b":function(t,e,n){t.exports=!n("8e60")&&!n("294c")(function(){return 7!=Object.defineProperty(n("1ec9")("div"),"a",{get:function(){return 7}}).a})},"79aa":function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},"7e63":function(t,e,n){},"8aae":function(t,e,n){n("32a6"),t.exports=n("584a").Object.keys},"8e60":function(t,e,n){t.exports=!n("294c")(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},a4bb:function(t,e,n){t.exports=n("8aae")},aa77:function(t,e,n){var r=n("5ca1"),i=n("be13"),a=n("79e5"),o=n("fdef"),s="["+o+"]",c="
",l=RegExp("^"+s+s+"*"),u=RegExp(s+s+"*$"),d=function(t,e,n){var i={},s=a(function(){return!!o[t]()||c[t]()!=c}),l=i[t]=s?e(f):o[t];n&&(i[n]=l),r(r.P+r.F*s,"String",i)},f=d.trim=function(t,e){return t=String(i(t)),1&e&&(t=t.replace(l,"")),2&e&&(t=t.replace(u,"")),t};t.exports=d},aae3:function(t,e,n){var r=n("d3f4"),i=n("2d95"),a=n("2b4c")("match");t.exports=function(t){var e;return r(t)&&(void 0!==(e=t[a])?!!e:"RegExp"==i(t))}},ac6a:function(t,e,n){for(var r=n("cadf"),i=n("0d58"),a=n("2aba"),o=n("7726"),s=n("32e9"),c=n("84f2"),l=n("2b4c"),u=l("iterator"),d=l("toStringTag"),f=c.Array,v={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},h=i(v),p=0;p<h.length;p++){var m,y=h[p],g=v[y],b=o[y],w=b&&b.prototype;if(w&&(w[u]||s(w,u,f),w[d]||s(w,d,y),c[y]=f,g))for(m in r)w[m]||a(w,m,r[m],!0)}},aebd:function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},b447:function(t,e,n){var r=n("3a38"),i=Math.min;t.exports=function(t){return t>0?i(r(t),9007199254740991):0}},b8e3:function(t,e){t.exports=!0},c3a1:function(t,e,n){var r=n("e6f3"),i=n("1691");t.exports=Object.keys||function(t){return r(t,i)}},cd1c:function(t,e,n){var r=n("e853");t.exports=function(t,e){return new(r(t))(e)}},ce7ec:function(t,e,n){var r=n("63b6"),i=n("584a"),a=n("294c");t.exports=function(t,e){var n=(i.Object||{})[t]||Object[t],o={};o[t]=e(n),r(r.S+r.F*a(function(){n(1)}),"Object",o)}},d2c8:function(t,e,n){var r=n("aae3"),i=n("be13");t.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return String(i(t))}},d864:function(t,e,n){var r=n("79aa");t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}return function(){return t.apply(e,arguments)}}},d9f6:function(t,e,n){var r=n("e4ae"),i=n("794b"),a=n("1bc3"),o=Object.defineProperty;e.f=n("8e60")?Object.defineProperty:function(t,e,n){if(r(t),e=a(e,!0),r(n),i)try{return o(t,e,n)}catch(s){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},dbdb:function(t,e,n){var r=n("584a"),i=n("e53d"),a="__core-js_shared__",o=i[a]||(i[a]={});(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:r.version,mode:n("b8e3")?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},e4ae:function(t,e,n){var r=n("f772");t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},e53d:function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},e6f3:function(t,e,n){var r=n("07e3"),i=n("36c3"),a=n("5b4e")(!1),o=n("5559")("IE_PROTO");t.exports=function(t,e){var n,s=i(t),c=0,l=[];for(n in s)n!=o&&r(s,n)&&l.push(n);while(e.length>c)r(s,n=e[c++])&&(~a(l,n)||l.push(n));return l}},e853:function(t,e,n){var r=n("d3f4"),i=n("1169"),a=n("2b4c")("species");t.exports=function(t){var e;return i(t)&&(e=t.constructor,"function"!=typeof e||e!==Array&&!i(e.prototype)||(e=void 0),r(e)&&(e=e[a],null===e&&(e=void 0))),void 0===e?Array:e}},f3e2:function(t,e,n){"use strict";var r=n("5ca1"),i=n("0a49")(0),a=n("2f21")([].forEach,!0);r(r.P+r.F*!a,"Array",{forEach:function(t){return i(this,t,arguments[1])}})},f4c7:function(t,e,n){"use strict";n.r(e);var r=function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.params?n("v-container",{attrs:{"grid-list-md":""}},[n("v-layout",{attrs:{row:"",wrap:""}},[n("v-card",{staticClass:"text-md-center ma-3"},[n("v-card-title",{attrs:{"primary-title":""}},[n("div",[n("h3",{staticClass:"headline mb-0"},[t._v("\n Please review cluster parameter values\n ")])])]),n("v-divider"),n("v-subheader",[t._v("Cluster master parameters")]),n("v-card-text",t._l(t.params.master,function(e){return n("div",{key:e.name},[e.range?n("v-select",{attrs:{items:e.range,label:t.createLabel(e)},model:{value:e.value,callback:function(n){t.$set(e,"value",n)},expression:"param.value"}}):n("v-text-field",{attrs:{label:t.createLabel(e),required:""},model:{value:e.value,callback:function(n){t.$set(e,"value",n)},expression:"param.value"}})],1)}),0),n("v-divider"),n("v-subheader",[t._v("Cluster nodes parameters")]),n("v-card-text",t._l(t.params.nodes,function(e){return n("div",{key:e.name},[e.range?n("v-select",{attrs:{items:e.range,label:t.createLabel(e)},model:{value:e.value,callback:function(n){t.$set(e,"value",n)},expression:"param.value"}}):n("v-text-field",{attrs:{label:t.createLabel(e),required:""},model:{value:e.value,callback:function(n){t.$set(e,"value",n)},expression:"param.value"}})],1)}),0),t.policies?n("div",[n("v-divider"),n("v-subheader",[t._v("Policy to attach to cluster and worker nodes")]),n("v-card-text",[n("v-select",{attrs:{items:t.policies,label:"Existing Policies"},on:{input:function(e){t.changeRoute()}},model:{value:t.selectedPolicy,callback:function(e){t.selectedPolicy=e},expression:"selectedPolicy"}})],1)],1):t._e(),t.params.network.length>0?n("div",[n("v-divider"),n("v-subheader",[t._v("Network parameters")]),t.existingNetworks?n("v-card-text",[n("v-select",{attrs:{items:t.existingNetworks,label:"Existing Networks"},model:{value:t.selectedNetwork,callback:function(e){t.selectedNetwork=e},expression:"selectedNetwork"}}),n("v-btn",{attrs:{color:"primary"},on:{click:function(e){t.existingNetworks=null}}},[t._v("Or Select new network")])],1):n("v-card-text",[t._l(t.params.network,function(e){return n("div",{key:e.name},[n("v-text-field",{attrs:{label:t.createLabel(e),required:""},model:{value:e.value,callback:function(n){t.$set(e,"value",n)},expression:"param.value"}})],1)}),n("v-btn",{attrs:{color:"primary"},on:{click:t.getExistingNetworks}},[t._v("Or Select existing network")])],2)],1):t._e(),n("v-divider"),n("v-subheader",[t._v("Map containers to parameter sets")]),n("v-card-text",t._l(t.instanceParamSets,function(e,r){return n("v-text-field",{key:r,attrs:{label:t.createReplicasLabel(r),required:""},model:{value:t.instanceParamSets[r],callback:function(e){t.$set(t.instanceParamSets,r,e)},expression:"instanceParamSets[key]"}})}),1),n("v-card-actions",[n("v-layout",{attrs:{row:"","justify-center":""}},[n("v-dialog",{staticClass:"mx-1",attrs:{persistent:"","max-width":"600px"},model:{value:t.permissions_error_dialog,callback:function(e){t.permissions_error_dialog=e},expression:"permissions_error_dialog"}},[n("v-btn",{attrs:{slot:"activator",color:"primary",dark:""},slot:"activator"},[t._v("Create Cluster")]),n("v-card",[n("v-card-title",[n("span",{staticClass:"headline"},[t._v("Terraform user credentials")])]),n("v-card-text",[n("v-container",{attrs:{"grid-list-md":""}},[n("v-layout",{attrs:{wrap:""}},t._l(t.csp.requiredCredentials,function(e){return n("v-flex",{key:e,attrs:{xs12:""}},[n("v-text-field",{attrs:{label:e},model:{value:t.credentialParameters[e],callback:function(n){t.$set(t.credentialParameters,e,n)},expression:"credentialParameters[credential]"}})],1)}),1)],1)],1),n("v-card-actions",[n("v-spacer"),n("v-btn",{attrs:{color:"blue darken-1",flat:""},on:{click:function(e){t.permissions_error_dialog=!1}}},[t._v("Cancel")]),n("v-btn",{attrs:{color:"blue darken-1",flat:""},on:{click:t.validateCredentials}},[t._v("OK")])],1)],1)],1),n("v-btn",{attrs:{color:"secondary"},on:{click:function(e){t.deployCluster(!0)}}},[t._v("Download Terraform Templates")])],1)],1)],1),t.clusterCreated?n("div",[n("h3",[t._v("Cluster created")]),t._v("\n Great job! The cluster is created. Terraform has created the following resources:\n "),n("br"),n("div",[n("pre",[t._v(t._s(t._f("pretty")(t.terraformResult)))])])]):t._e()],1),n("v-dialog",{attrs:{persistent:"","max-width":"600"},model:{value:t.policyValidationErrorDialog,callback:function(e){t.policyValidationErrorDialog=e},expression:"policyValidationErrorDialog"}},[n("v-card",[n("v-card-title",{staticClass:"headline"},[t._v("Policy '"+t._s(t.selectedPolicy)+"' does not have the required permissions\n ")]),n("v-card-text",[t._v("Please select another policy or add to '"+t._s(t.selectedPolicy)+"' the following permissions:\n ")]),n("v-list",{attrs:{dense:""}},t._l(t.policyValidationError,function(e){return n("v-list-tile",{key:e},[n("v-list-tile-content",[n("v-list-tile-title",{domProps:{textContent:t._s(e)}})],1)],1)}),1),n("v-card-actions",[n("v-spacer"),n("v-btn",{attrs:{color:"green darken-1",flat:""},on:{click:function(e){t.policyValidationErrorDialog=!1}}},[t._v("Close")])],1)],1)],1)],1):t._e()},i=[],a=(n("ac6a"),n("f3e2"),n("6762"),n("2fdb"),n("4f37"),n("7514"),n("a4bb")),o=n.n(a),s=(n("6d67"),n("7f7f"),n("cadf"),n("551c"),n("097d"),{data:function(){return{csp:this.$route.params.csp,paramSets:this.$route.params.paramSets,valid:!0,clusterCreated:!1,terraformResult:null,permissions_error_dialog:!1,existingNetworks:null,selectedNetwork:null,policies:null,selectedPolicy:null,policyValidationErrorDialog:!1,policyValidationError:[],credentialParameters:{},params:null,instanceParamSets:{}}},methods:{createLabel:function(t){return t.name+" ("+t.description+")"},createReplicasLabel:function(t){return"Number of containers using "+t},getExistingNetworks:function(){var t=this;this.$http.get("networks/"+this.csp.name).then(function(e){console.log(e),t.existingNetworks=e.data},function(t){console.log(t),alert(t.data)})},validateCredentials:function(){var t=this;this.credentialParameters["region"]=this.csp.region;var e={csp:this.csp.name,parameters:this.credentialParameters};console.log(e),this.$http.post("credentials",e).then(function(e){console.log(e),t.permissions_error_dialog=!1,t.deployCluster(!1)},function(t){console.log(t),alert(t.data)})},changeRoute:function(){var t=this;console.log(this.selectedPolicy);var e={csp:this.csp.name,parameters:{policy:this.selectedPolicy}};this.$http.post("policy/validate",e).then(function(e){console.log(e.data),e.data.notAllowedActions.length>0&&(t.policyValidationErrorDialog=!0,t.policyValidationError=e.data.notAllowedActions)},function(t){alert(t.data)})},deployCluster:function(t){var e=this,n={};for(var r in this.params.master){var i=this.params.master[r];n[i.name]=i.value}for(var a in this.params.nodes){var s=this.params.nodes[a];n[s.name]=s.value}if(this.selectedNetwork)n["existing-network-name"]=this.selectedNetwork;else for(var c in this.params.network){var l=this.params.network[c];n[l.name]=l.value}var u=o()(this.instanceParamSets).map(function(t){return t+":"+e.instanceParamSets[t]}).join(",");n["containersPerParamSet"]=u,this.selectedPolicy&&(n["jemo-policy-name"]=this.selectedPolicy),this.$router.push({name:"create-cluster",params:{csp:this.csp,parameters:n,downloadFormsOnly:t}})},init:function(){var t=this;this.$http.get("cluster/params/"+this.csp.name).then(function(e){console.log(e),t.params=e.data;var n=t.params.master.find(function(t){return"workstation-external-cidr"===t.name});n&&t.$http.get("https://ipv4.icanhazip.com").then(function(t){console.log(t),n.value=t.data.trim()+"/32"},function(t){console.log("Can not find local ip"),console.log(t)})},function(t){console.log(t)}),this.$http.get("policy/"+this.csp.name).then(function(e){console.log(e),t.policies=e.data,t.policies&&t.policies.includes("jemo-policy")&&(t.selectedPolicy="jemo-policy")},function(t){console.log(t)}),this.paramSets.forEach(function(e){return t.instanceParamSets[e.name]=0})}},created:function(){this.init()},watch:{$route:function(t){var e=this;"prod-conf"===t.name&&(this.csp=t.params.csp?t.params.csp:this.csp,this.paramSets=t.params.paramSets?t.params.paramSets:this.paramSets,t.params.csp.name!==this.csp.name?this.init():this.paramSets.forEach(function(t){return e.instanceParamSets[t.name]=0}))}}}),c=s,l=n("2877"),u=n("6544"),d=n.n(u),f=n("8336"),v=n("b0af"),h=n("99d9"),p=n("12b2"),m=n("a523"),y=n("169a"),g=n("ce7e"),b=n("0e8f"),w=n("a722"),x=n("8860"),k=n("ba95"),S=n("5d23"),_=n("b56d"),P=n("9910"),L=n("e0c7"),C=n("2677"),T=Object(l["a"])(c,r,i,!1,null,null,null);T.options.__file="ProdConf.vue";e["default"]=T.exports;d()(T,{VBtn:f["a"],VCard:v["a"],VCardActions:h["a"],VCardText:h["b"],VCardTitle:p["a"],VContainer:m["a"],VDialog:y["a"],VDivider:g["a"],VFlex:b["a"],VLayout:w["a"],VList:x["a"],VListTile:k["a"],VListTileContent:S["a"],VListTileTitle:S["b"],VSelect:_["a"],VSpacer:P["a"],VSubheader:L["a"],VTextField:C["a"]})},f772:function(t,e){t.exports=function(t){return"object"===typeof t?null!==t:"function"===typeof t}},f7dc:function(t,e,n){},fdef:function(t,e){t.exports="\t\n\v\f\r \u2028\u2029\ufeff"}}]);
+//# sourceMappingURL=chunk-975357a2.a9960b1d.js.map
\ No newline at end of file
diff --git a/core/src/main/resources/setup/js/chunk-975357a2.f01b5bb0.js.map b/core/src/main/resources/setup/js/chunk-975357a2.a9960b1d.js.map
similarity index 72%
rename from core/src/main/resources/setup/js/chunk-975357a2.f01b5bb0.js.map
rename to core/src/main/resources/setup/js/chunk-975357a2.a9960b1d.js.map
index e3b19dc..29e0f05 100644
--- a/core/src/main/resources/setup/js/chunk-975357a2.f01b5bb0.js.map
+++ b/core/src/main/resources/setup/js/chunk-975357a2.a9960b1d.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///./node_modules/core-js/library/modules/_has.js","webpack:///./node_modules/core-js/modules/_array-methods.js","webpack:///./node_modules/core-js/library/modules/_to-absolute-index.js","webpack:///./node_modules/core-js/modules/_is-array.js","webpack:///./node_modules/core-js/library/modules/_enum-bug-keys.js","webpack:///./node_modules/vuetify/lib/mixins/overlayable.js","webpack:///./node_modules/vuetify/lib/components/VDialog/VDialog.js","webpack:///./node_modules/core-js/library/modules/_to-primitive.js","webpack:///./node_modules/core-js/library/modules/_dom-create.js","webpack:///./node_modules/core-js/library/modules/_to-object.js","webpack:///./node_modules/core-js/library/modules/_defined.js","webpack:///./node_modules/vuetify/lib/components/VTextarea/VTextarea.js","webpack:///./node_modules/vuetify/lib/components/VTextField/index.js","webpack:///./node_modules/core-js/library/modules/_fails.js","webpack:///./node_modules/core-js/modules/_strict-method.js","webpack:///./node_modules/core-js/modules/es6.string.includes.js","webpack:///./node_modules/core-js/library/modules/es6.object.keys.js","webpack:///./node_modules/core-js/library/modules/_iobject.js","webpack:///./node_modules/core-js/library/modules/_hide.js","webpack:///./node_modules/core-js/library/modules/_to-iobject.js","webpack:///./node_modules/core-js/library/modules/_to-integer.js","webpack:///./node_modules/core-js/modules/es6.string.trim.js","webpack:///./node_modules/core-js/modules/_fails-is-regexp.js","webpack:///./node_modules/core-js/library/modules/_shared-key.js","webpack:///./node_modules/core-js/library/modules/_core.js","webpack:///./node_modules/core-js/library/modules/_array-includes.js","webpack:///./node_modules/core-js/library/modules/_uid.js","webpack:///./node_modules/core-js/library/modules/_export.js","webpack:///./node_modules/core-js/modules/es7.array.includes.js","webpack:///./node_modules/core-js/library/modules/_cof.js","webpack:///./node_modules/core-js/modules/es6.array.map.js","webpack:///./node_modules/core-js/modules/es6.array.find.js","webpack:///./node_modules/core-js/library/modules/_ie8-dom-define.js","webpack:///./node_modules/core-js/library/modules/_a-function.js","webpack:///./node_modules/core-js/library/fn/object/keys.js","webpack:///./node_modules/core-js/library/modules/_descriptors.js","webpack:///./node_modules/@babel/runtime-corejs2/core-js/object/keys.js","webpack:///./node_modules/core-js/modules/_string-trim.js","webpack:///./node_modules/core-js/modules/_is-regexp.js","webpack:///./node_modules/core-js/modules/web.dom.iterable.js","webpack:///./node_modules/core-js/library/modules/_property-desc.js","webpack:///./node_modules/core-js/library/modules/_to-length.js","webpack:///./node_modules/core-js/library/modules/_library.js","webpack:///./node_modules/core-js/library/modules/_object-keys.js","webpack:///./node_modules/core-js/modules/_array-species-create.js","webpack:///./node_modules/core-js/library/modules/_object-sap.js","webpack:///./node_modules/core-js/modules/_string-context.js","webpack:///./node_modules/core-js/library/modules/_ctx.js","webpack:///./node_modules/core-js/library/modules/_object-dp.js","webpack:///./node_modules/core-js/library/modules/_shared.js","webpack:///./node_modules/core-js/library/modules/_an-object.js","webpack:///./node_modules/core-js/library/modules/_global.js","webpack:///./node_modules/core-js/library/modules/_object-keys-internal.js","webpack:///./node_modules/core-js/modules/_array-species-constructor.js","webpack:///./node_modules/core-js/modules/es6.array.for-each.js","webpack:///./src/views/ProdConf.vue?efb9","webpack:///src/views/ProdConf.vue","webpack:///./src/views/ProdConf.vue?3134","webpack:///./src/views/ProdConf.vue","webpack:///./node_modules/core-js/library/modules/_is-object.js","webpack:///./node_modules/core-js/modules/_string-ws.js"],"names":["hasOwnProperty","module","exports","it","key","call","ctx","__webpack_require__","IObject","toObject","toLength","asc","TYPE","$create","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","create","$this","callbackfn","that","val","res","O","self","f","length","index","result","undefined","push","toInteger","max","Math","min","cof","Array","isArray","arg","split","overlayable","name","props","hideOverlay","Boolean","data","overlay","overlayOffset","overlayTimeout","overlayTransitionDuration","beforeDestroy","this","removeOverlay","methods","genOverlay","_this","isActive","clearTimeout","classList","add","document","createElement","className","absolute","hideScroll","parent","$el","parentNode","querySelector","insertBefore","firstChild","clientHeight","requestAnimationFrame","activeZIndex","style","zIndex","_this2","showScroll","arguments","remove","setTimeout","removeChild","e","console","log","scrollListener","type","includes","target","tagName","isContentEditable","up","helpers","pageup","down","pagedown","keyCode","deltaY","body","checkPath","preventDefault","hasScrollbar","el","nodeType","Node","ELEMENT_NODE","window","getComputedStyle","scrollHeight","shouldScroll","delta","scrollTop","isInside","path","composedPath","wheelDelta","dialog","$refs","selected","getSelection","anchorNode","documentElement","content","parentElement","$vuetify","breakpoint","smAndDown","addEventListener","removeEventListener","_extends","Object","assign","i","source","prototype","_defineProperty","obj","value","defineProperty","enumerable","configurable","writable","__webpack_exports__","directives","ClickOutside","click_outside","mixins","dependent","detachable","returnable","stackable","toggleable","disabled","persistent","fullscreen","fullWidth","noClickAnimation","light","dark","maxWidth","String","Number","default","origin","width","scrollable","transition","animate","animateTimeout","stackClass","stackMinZIndex","computed","classes","_ref","contentClass","trim","contentClasses","v-dialog__content","v-dialog__content--active","watch","show","unbind","beforeMount","$nextTick","isBooted","animateClick","closeConditional","contains","getMaxZIndex","focus","$listeners","keydown","bind","onKeydown","$emit","genActivator","_this3","$slots","activator","$scopedSlots","listeners","click","stopPropagation","on","activatorNode","$createElement","staticClass","class","v-dialog__activator--disabled","render","h","_this4","children","ref","args","include","getOpenDependentElements","showLazyContent","attrs","tabIndex","getScopeIdAttrs","ThemeProvider","root","display","isObject","S","fn","toString","valueOf","TypeError","is","defined","VTextarea","extends","VTextField","autoGrow","noResize","outline","rowHeight","validator","v","isNaN","parseFloat","rows","parseInt","v-textarea","v-textarea--auto-grow","v-textarea--no-resize","noResizeHandle","options","dynamicHeight","inputHeight","isEnclosed","textarea","lazyValue","internalChange","calculateInputHeight","mounted","input","height","minHeight","genInput","tag","onInput","onKeyDown","isFocused","d","wrapper","functional","$_wrapperFor","multiLine","slots","dedupeModelListeners","rebuildFunctionalSlots","exec","fails","method","$export","context","INCLUDES","P","F","searchString","indexOf","$keys","propertyIsEnumerable","dP","createDesc","object","ceil","floor","$trim","MATCH","KEY","re","shared","uid","core","version","__e","toIObject","toAbsoluteIndex","IS_INCLUDES","fromIndex","id","px","random","concat","global","hide","has","PROTOTYPE","own","out","IS_FORCED","IS_GLOBAL","G","IS_STATIC","IS_PROTO","IS_BIND","B","IS_WRAP","W","expProto","C","a","b","c","apply","Function","virtual","R","U","$includes","slice","$map","map","$find","forced","find","get","keys","spaces","space","non","ltrim","RegExp","rtrim","exporter","ALIAS","exp","FORCE","string","replace","isRegExp","$iterators","getKeys","redefine","Iterators","wks","ITERATOR","TO_STRING_TAG","ArrayValues","DOMIterables","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","collections","NAME","explicit","Collection","proto","bitmap","enumBugKeys","speciesConstructor","original","aFunction","anObject","IE8_DOM_DEFINE","toPrimitive","Attributes","SHARED","store","mode","copyright","__g","arrayIndexOf","IE_PROTO","names","SPECIES","constructor","$forEach","STRICT","forEach","_vm","_h","_c","_self","grid-list-md","row","wrap","primary-title","_v","_l","params","param","items","range","label","createLabel","model","callback","$$v","$set","expression","required","policies","$event","changeRoute","selectedPolicy","_e","existingNetworks","selectedNetwork","color","getExistingNetworks","createReplicasLabel","instanceParamSets","justify-center","max-width","permissions_error_dialog","slot","csp","credential","xs12","credentialParameters","flat","validateCredentials","deployCluster","_s","_f","terraformResult","policyValidationErrorDialog","dense","permission","domProps","textContent","staticRenderFns","ProdConfvue_type_script_lang_js_","$route","paramSets","valid","clusterCreated","policyValidationError","description","paramSetName","$http","then","response","alert","region","payload","parameters","post","policy","notAllowedActions","downloadFormsOnly","master","_key","nodes","_param","_key2","network","_param2","containersPerParamSet","keys_default","k","join","$router","init","_this5","workstationExternalCidr","paramSet","created","to","_this6","views_ProdConfvue_type_script_lang_js_","component","componentNormalizer","__file","installComponents_default","VBtn","VCard","VCardActions","components_VCard","VCardText","VCardTitle","VContainer","VDialog","VDivider","VFlex","VLayout","VList","VListTile","VListTileContent","components_VList","VListTileTitle","VSelect","VSpacer","VGrid","VSubheader"],"mappings":"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","file":"js/chunk-975357a2.f01b5bb0.js","sourcesContent":["var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","import '../../src/stylus/components/_overlay.styl';\n// Utils\nimport { keyCodes } from '../util/helpers';\n/* @vue/component */\nexport default {\n name: 'overlayable',\n props: {\n hideOverlay: Boolean\n },\n data: function data() {\n return {\n overlay: null,\n overlayOffset: 0,\n overlayTimeout: null,\n overlayTransitionDuration: 500 + 150 // transition + delay\n };\n },\n beforeDestroy: function beforeDestroy() {\n this.removeOverlay();\n },\n\n methods: {\n genOverlay: function genOverlay() {\n var _this = this;\n\n // If fn is called and timeout is active\n // or overlay already exists\n // cancel removal of overlay and re-add active\n if (!this.isActive || this.hideOverlay || this.isActive && this.overlayTimeout || this.overlay) {\n clearTimeout(this.overlayTimeout);\n return this.overlay && this.overlay.classList.add('v-overlay--active');\n }\n this.overlay = document.createElement('div');\n this.overlay.className = 'v-overlay';\n if (this.absolute) this.overlay.className += ' v-overlay--absolute';\n this.hideScroll();\n var parent = this.absolute ? this.$el.parentNode : document.querySelector('[data-app]');\n parent && parent.insertBefore(this.overlay, parent.firstChild);\n // eslint-disable-next-line no-unused-expressions\n this.overlay.clientHeight; // Force repaint\n requestAnimationFrame(function () {\n // https://github.com/vuetifyjs/vuetify/issues/4678\n if (!_this.overlay) return;\n _this.overlay.className += ' v-overlay--active';\n if (_this.activeZIndex !== undefined) {\n _this.overlay.style.zIndex = _this.activeZIndex - 1;\n }\n });\n return true;\n },\n\n /** removeOverlay(false) will not restore the scollbar afterwards */\n removeOverlay: function removeOverlay() {\n var _this2 = this;\n\n var showScroll = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n if (!this.overlay) {\n return showScroll && this.showScroll();\n }\n this.overlay.classList.remove('v-overlay--active');\n this.overlayTimeout = setTimeout(function () {\n // IE11 Fix\n try {\n if (_this2.overlay && _this2.overlay.parentNode) {\n _this2.overlay.parentNode.removeChild(_this2.overlay);\n }\n _this2.overlay = null;\n showScroll && _this2.showScroll();\n } catch (e) {\n console.log(e);\n }\n clearTimeout(_this2.overlayTimeout);\n _this2.overlayTimeout = null;\n }, this.overlayTransitionDuration);\n },\n\n /**\n * @param {Event} e\n * @returns void\n */\n scrollListener: function scrollListener(e) {\n if (e.type === 'keydown') {\n if (['INPUT', 'TEXTAREA', 'SELECT'].includes(e.target.tagName) ||\n // https://github.com/vuetifyjs/vuetify/issues/4715\n e.target.isContentEditable) return;\n var up = [keyCodes.up, keyCodes.pageup];\n var down = [keyCodes.down, keyCodes.pagedown];\n if (up.includes(e.keyCode)) {\n e.deltaY = -1;\n } else if (down.includes(e.keyCode)) {\n e.deltaY = 1;\n } else {\n return;\n }\n }\n if (e.target === this.overlay || e.type !== 'keydown' && e.target === document.body || this.checkPath(e)) e.preventDefault();\n },\n hasScrollbar: function hasScrollbar(el) {\n if (!el || el.nodeType !== Node.ELEMENT_NODE) return false;\n var style = window.getComputedStyle(el);\n return ['auto', 'scroll'].includes(style['overflow-y']) && el.scrollHeight > el.clientHeight;\n },\n shouldScroll: function shouldScroll(el, delta) {\n if (el.scrollTop === 0 && delta < 0) return true;\n return el.scrollTop + el.clientHeight === el.scrollHeight && delta > 0;\n },\n isInside: function isInside(el, parent) {\n if (el === parent) {\n return true;\n } else if (el === null || el === document.body) {\n return false;\n } else {\n return this.isInside(el.parentNode, parent);\n }\n },\n\n /**\n * @param {Event} e\n * @returns boolean\n */\n checkPath: function checkPath(e) {\n var path = e.path || this.composedPath(e);\n var delta = e.deltaY || -e.wheelDelta;\n if (e.type === 'keydown' && path[0] === document.body) {\n var dialog = this.$refs.dialog;\n var selected = window.getSelection().anchorNode;\n if (this.hasScrollbar(dialog) && this.isInside(selected, dialog)) {\n return this.shouldScroll(dialog, delta);\n }\n return true;\n }\n for (var index = 0; index < path.length; index++) {\n var el = path[index];\n if (el === document) return true;\n if (el === document.documentElement) return true;\n if (el === this.$refs.content) return true;\n if (this.hasScrollbar(el)) return this.shouldScroll(el, delta);\n }\n return true;\n },\n\n /**\n * Polyfill for Event.prototype.composedPath\n * @param {Event} e\n * @returns Element[]\n */\n composedPath: function composedPath(e) {\n if (e.composedPath) return e.composedPath();\n var path = [];\n var el = e.target;\n while (el) {\n path.push(el);\n if (el.tagName === 'HTML') {\n path.push(document);\n path.push(window);\n return path;\n }\n el = el.parentElement;\n }\n },\n hideScroll: function hideScroll() {\n if (this.$vuetify.breakpoint.smAndDown) {\n document.documentElement.classList.add('overflow-y-hidden');\n } else {\n window.addEventListener('wheel', this.scrollListener);\n window.addEventListener('keydown', this.scrollListener);\n }\n },\n showScroll: function showScroll() {\n document.documentElement.classList.remove('overflow-y-hidden');\n window.removeEventListener('wheel', this.scrollListener);\n window.removeEventListener('keydown', this.scrollListener);\n }\n }\n};\n//# sourceMappingURL=overlayable.js.map","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nimport '../../../src/stylus/components/_dialogs.styl';\n// Mixins\nimport Dependent from '../../mixins/dependent';\nimport Detachable from '../../mixins/detachable';\nimport Overlayable from '../../mixins/overlayable';\nimport Returnable from '../../mixins/returnable';\nimport Stackable from '../../mixins/stackable';\nimport Toggleable from '../../mixins/toggleable';\n// Directives\nimport ClickOutside from '../../directives/click-outside';\n// Helpers\nimport { getZIndex, convertToUnit } from '../../util/helpers';\nimport ThemeProvider from '../../util/ThemeProvider';\n/* @vue/component */\nexport default {\n name: 'v-dialog',\n directives: {\n ClickOutside: ClickOutside\n },\n mixins: [Dependent, Detachable, Overlayable, Returnable, Stackable, Toggleable],\n props: {\n disabled: Boolean,\n persistent: Boolean,\n fullscreen: Boolean,\n fullWidth: Boolean,\n noClickAnimation: Boolean,\n light: Boolean,\n dark: Boolean,\n maxWidth: {\n type: [String, Number],\n default: 'none'\n },\n origin: {\n type: String,\n default: 'center center'\n },\n width: {\n type: [String, Number],\n default: 'auto'\n },\n scrollable: Boolean,\n transition: {\n type: [String, Boolean],\n default: 'dialog-transition'\n }\n },\n data: function data() {\n return {\n animate: false,\n animateTimeout: null,\n stackClass: 'v-dialog__content--active',\n stackMinZIndex: 200\n };\n },\n\n computed: {\n classes: function classes() {\n var _ref;\n\n return _ref = {}, _defineProperty(_ref, ('v-dialog ' + this.contentClass).trim(), true), _defineProperty(_ref, 'v-dialog--active', this.isActive), _defineProperty(_ref, 'v-dialog--persistent', this.persistent), _defineProperty(_ref, 'v-dialog--fullscreen', this.fullscreen), _defineProperty(_ref, 'v-dialog--scrollable', this.scrollable), _defineProperty(_ref, 'v-dialog--animated', this.animate), _ref;\n },\n contentClasses: function contentClasses() {\n return {\n 'v-dialog__content': true,\n 'v-dialog__content--active': this.isActive\n };\n }\n },\n watch: {\n isActive: function isActive(val) {\n if (val) {\n this.show();\n this.hideScroll();\n } else {\n this.removeOverlay();\n this.unbind();\n }\n },\n fullscreen: function fullscreen(val) {\n if (!this.isActive) return;\n if (val) {\n this.hideScroll();\n this.removeOverlay(false);\n } else {\n this.showScroll();\n this.genOverlay();\n }\n }\n },\n beforeMount: function beforeMount() {\n var _this = this;\n\n this.$nextTick(function () {\n _this.isBooted = _this.isActive;\n _this.isActive && _this.show();\n });\n },\n beforeDestroy: function beforeDestroy() {\n if (typeof window !== 'undefined') this.unbind();\n },\n\n methods: {\n animateClick: function animateClick() {\n var _this2 = this;\n\n this.animate = false;\n // Needed for when clicking very fast\n // outside of the dialog\n this.$nextTick(function () {\n _this2.animate = true;\n clearTimeout(_this2.animateTimeout);\n _this2.animateTimeout = setTimeout(function () {\n return _this2.animate = false;\n }, 150);\n });\n },\n closeConditional: function closeConditional(e) {\n // If the dialog content contains\n // the click event, or if the\n // dialog is not active\n if (this.$refs.content.contains(e.target) || !this.isActive) return false;\n // If we made it here, the click is outside\n // and is active. If persistent, and the\n // click is on the overlay, animate\n if (this.persistent) {\n if (!this.noClickAnimation && this.overlay === e.target) this.animateClick();\n return false;\n }\n // close dialog if !persistent, clicked outside and we're the topmost dialog.\n // Since this should only be called in a capture event (bottom up), we shouldn't need to stop propagation\n return getZIndex(this.$refs.content) >= this.getMaxZIndex();\n },\n hideScroll: function hideScroll() {\n if (this.fullscreen) {\n document.documentElement.classList.add('overflow-y-hidden');\n } else {\n Overlayable.methods.hideScroll.call(this);\n }\n },\n show: function show() {\n !this.fullscreen && !this.hideOverlay && this.genOverlay();\n this.$refs.content.focus();\n this.$listeners.keydown && this.bind();\n },\n bind: function bind() {\n window.addEventListener('keydown', this.onKeydown);\n },\n unbind: function unbind() {\n window.removeEventListener('keydown', this.onKeydown);\n },\n onKeydown: function onKeydown(e) {\n this.$emit('keydown', e);\n },\n genActivator: function genActivator() {\n var _this3 = this;\n\n if (!this.$slots.activator && !this.$scopedSlots.activator) return null;\n var listeners = this.disabled ? {} : {\n click: function click(e) {\n e.stopPropagation();\n if (!_this3.disabled) _this3.isActive = !_this3.isActive;\n }\n };\n if (this.$scopedSlots.activator) {\n var activator = this.$scopedSlots.activator({ on: listeners });\n this.activatorNode = activator;\n return activator;\n }\n return this.$createElement('div', {\n staticClass: 'v-dialog__activator',\n 'class': {\n 'v-dialog__activator--disabled': this.disabled\n },\n on: listeners\n }, [this.$slots.activator]);\n }\n },\n render: function render(h) {\n var _this4 = this;\n\n var children = [];\n var data = {\n 'class': this.classes,\n ref: 'dialog',\n directives: [{\n name: 'click-outside',\n value: function value() {\n return _this4.isActive = false;\n },\n args: {\n closeConditional: this.closeConditional,\n include: this.getOpenDependentElements\n }\n }, { name: 'show', value: this.isActive }],\n on: {\n click: function click(e) {\n e.stopPropagation();\n }\n }\n };\n if (!this.fullscreen) {\n data.style = {\n maxWidth: this.maxWidth === 'none' ? undefined : convertToUnit(this.maxWidth),\n width: this.width === 'auto' ? undefined : convertToUnit(this.width)\n };\n }\n children.push(this.genActivator());\n var dialog = h('div', data, this.showLazyContent(this.$slots.default));\n if (this.transition) {\n dialog = h('transition', {\n props: {\n name: this.transition,\n origin: this.origin\n }\n }, [dialog]);\n }\n children.push(h('div', {\n 'class': this.contentClasses,\n attrs: _extends({\n tabIndex: '-1'\n }, this.getScopeIdAttrs()),\n style: { zIndex: this.activeZIndex },\n ref: 'content'\n }, [this.$createElement(ThemeProvider, {\n props: {\n root: true,\n light: this.light,\n dark: this.dark\n }\n }, [dialog])]));\n return h('div', {\n staticClass: 'v-dialog__container',\n style: {\n display: !this.$slots.activator || this.fullWidth ? 'block' : 'inline-block'\n }\n }, children);\n }\n};\n//# sourceMappingURL=VDialog.js.map","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n// Styles\nimport '../../../src/stylus/components/_textarea.styl';\n// Extensions\nimport VTextField from '../VTextField/VTextField';\nimport { consoleInfo } from '../../util/console';\n/* @vue/component */\nexport default {\n name: 'v-textarea',\n extends: VTextField,\n props: {\n autoGrow: Boolean,\n noResize: Boolean,\n outline: Boolean,\n rowHeight: {\n type: [Number, String],\n default: 24,\n validator: function validator(v) {\n return !isNaN(parseFloat(v));\n }\n },\n rows: {\n type: [Number, String],\n default: 5,\n validator: function validator(v) {\n return !isNaN(parseInt(v, 10));\n }\n }\n },\n computed: {\n classes: function classes() {\n return _extends({\n 'v-textarea': true,\n 'v-textarea--auto-grow': this.autoGrow,\n 'v-textarea--no-resize': this.noResizeHandle\n }, VTextField.options.computed.classes.call(this, null));\n },\n dynamicHeight: function dynamicHeight() {\n return this.autoGrow ? this.inputHeight : 'auto';\n },\n isEnclosed: function isEnclosed() {\n return this.textarea || VTextField.options.computed.isEnclosed.call(this);\n },\n noResizeHandle: function noResizeHandle() {\n return this.noResize || this.autoGrow;\n }\n },\n watch: {\n lazyValue: function lazyValue() {\n !this.internalChange && this.autoGrow && this.$nextTick(this.calculateInputHeight);\n }\n },\n mounted: function mounted() {\n var _this = this;\n\n setTimeout(function () {\n _this.autoGrow && _this.calculateInputHeight();\n }, 0);\n // TODO: remove (2.0)\n if (this.autoGrow && this.noResize) {\n consoleInfo('\"no-resize\" is now implied when using \"auto-grow\", and can be removed', this);\n }\n },\n\n methods: {\n calculateInputHeight: function calculateInputHeight() {\n var input = this.$refs.input;\n if (input) {\n input.style.height = 0;\n var height = input.scrollHeight;\n var minHeight = parseInt(this.rows, 10) * parseFloat(this.rowHeight);\n // This has to be done ASAP, waiting for Vue\n // to update the DOM causes ugly layout jumping\n input.style.height = Math.max(minHeight, height) + 'px';\n }\n },\n genInput: function genInput() {\n var input = VTextField.options.methods.genInput.call(this);\n input.tag = 'textarea';\n delete input.data.attrs.type;\n input.data.attrs.rows = this.rows;\n return input;\n },\n onInput: function onInput(e) {\n VTextField.options.methods.onInput.call(this, e);\n this.autoGrow && this.calculateInputHeight();\n },\n onKeyDown: function onKeyDown(e) {\n // Prevents closing of a\n // dialog when pressing\n // enter\n if (this.isFocused && e.keyCode === 13) {\n e.stopPropagation();\n }\n this.internalChange = true;\n this.$emit('keydown', e);\n }\n }\n};\n//# sourceMappingURL=VTextarea.js.map","import VTextField from './VTextField';\nimport VTextarea from '../VTextarea/VTextarea';\nimport rebuildSlots from '../../util/rebuildFunctionalSlots';\nimport dedupeModelListeners from '../../util/dedupeModelListeners';\nimport { deprecate } from '../../util/console';\n// TODO: remove this in v2.0\n/* @vue/component */\nvar wrapper = {\n functional: true,\n $_wrapperFor: VTextField,\n props: {\n textarea: Boolean,\n multiLine: Boolean\n },\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n slots = _ref.slots,\n parent = _ref.parent;\n\n dedupeModelListeners(data);\n var children = rebuildSlots(slots(), h);\n if (props.textarea) {\n deprecate('<v-text-field textarea>', '<v-textarea outline>', wrapper, parent);\n }\n if (props.multiLine) {\n deprecate('<v-text-field multi-line>', '<v-textarea>', wrapper, parent);\n }\n if (props.textarea || props.multiLine) {\n data.attrs.outline = props.textarea;\n return h(VTextarea, data, children);\n } else {\n return h(VTextField, data, children);\n }\n }\n};\nexport { wrapper as VTextField };\nexport default wrapper;\n//# sourceMappingURL=index.js.map","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","'use strict';\nvar fails = require('./_fails');\n\nmodule.exports = function (method, arg) {\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call\n arg ? method.call(null, function () { /* empty */ }, 1) : method.call(null);\n });\n};\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","'use strict';\n// 21.1.3.25 String.prototype.trim()\nrequire('./_string-trim')('trim', function ($trim) {\n return function trim() {\n return $trim(this, 3);\n };\n});\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var core = module.exports = { version: '2.6.1' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar ctx = require('./_ctx');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var IS_WRAP = type & $export.W;\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE];\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];\n var key, own, out;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n if (own && has(exports, key)) continue;\n // export native or passed\n out = own ? target[key] : source[key];\n // prevent global pollution for namespaces\n exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n // bind timers to global for call from export context\n : IS_BIND && own ? ctx(out, global)\n // wrap global constructors for prevent change them in library\n : IS_WRAP && target[key] == out ? (function (C) {\n var F = function (a, b, c) {\n if (this instanceof C) {\n switch (arguments.length) {\n case 0: return new C();\n case 1: return new C(a);\n case 2: return new C(a, b);\n } return new C(a, b, c);\n } return C.apply(this, arguments);\n };\n F[PROTOTYPE] = C[PROTOTYPE];\n return F;\n // make static versions for prototype methods\n })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n if (IS_PROTO) {\n (exports.virtual || (exports.virtual = {}))[key] = out;\n // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);\n }\n }\n};\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","'use strict';\nvar $export = require('./_export');\nvar $map = require('./_array-methods')(1);\n\n$export($export.P + $export.F * !require('./_strict-method')([].map, true), 'Array', {\n // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments[1]);\n }\n});\n","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","require('../../modules/es6.object.keys');\nmodule.exports = require('../../modules/_core').Object.keys;\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","module.exports = require(\"core-js/library/fn/object/keys\");","var $export = require('./_export');\nvar defined = require('./_defined');\nvar fails = require('./_fails');\nvar spaces = require('./_string-ws');\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","module.exports = true;\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\n});\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","'use strict';\nvar $export = require('./_export');\nvar $forEach = require('./_array-methods')(0);\nvar STRICT = require('./_strict-method')([].forEach, true);\n\n$export($export.P + $export.F * !STRICT, 'Array', {\n // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])\n forEach: function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments[1]);\n }\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.params)?_c('v-container',{attrs:{\"grid-list-md\":\"\"}},[_c('v-layout',{attrs:{\"row\":\"\",\"wrap\":\"\"}},[_c('v-card',{staticClass:\"text-md-center ma-3\"},[_c('v-card-title',{attrs:{\"primary-title\":\"\"}},[_c('div',[_c('h3',{staticClass:\"headline mb-0\"},[_vm._v(\"\\n Please review cluster parameter values\\n \")])])]),_c('v-divider'),_c('v-subheader',[_vm._v(\"Cluster master parameters\")]),_c('v-card-text',_vm._l((_vm.params.master),function(param){return _c('div',{key:param.name},[(param.range)?_c('v-select',{attrs:{\"items\":param.range,\"label\":_vm.createLabel(param)},model:{value:(param.value),callback:function ($$v) {_vm.$set(param, \"value\", $$v)},expression:\"param.value\"}}):_c('v-text-field',{attrs:{\"label\":_vm.createLabel(param),\"required\":\"\"},model:{value:(param.value),callback:function ($$v) {_vm.$set(param, \"value\", $$v)},expression:\"param.value\"}})],1)}),0),_c('v-divider'),_c('v-subheader',[_vm._v(\"Cluster nodes parameters\")]),_c('v-card-text',_vm._l((_vm.params.nodes),function(param){return _c('div',{key:param.name},[(param.range)?_c('v-select',{attrs:{\"items\":param.range,\"label\":_vm.createLabel(param)},model:{value:(param.value),callback:function ($$v) {_vm.$set(param, \"value\", $$v)},expression:\"param.value\"}}):_c('v-text-field',{attrs:{\"label\":_vm.createLabel(param),\"required\":\"\"},model:{value:(param.value),callback:function ($$v) {_vm.$set(param, \"value\", $$v)},expression:\"param.value\"}})],1)}),0),(_vm.policies)?_c('div',[_c('v-divider'),_c('v-subheader',[_vm._v(\"Policy to attach to cluster and worker nodes\")]),_c('v-card-text',[_c('v-select',{attrs:{\"items\":_vm.policies,\"label\":\"Existing Policies\"},on:{\"input\":function($event){_vm.changeRoute()}},model:{value:(_vm.selectedPolicy),callback:function ($$v) {_vm.selectedPolicy=$$v},expression:\"selectedPolicy\"}})],1)],1):_vm._e(),_c('v-divider'),_c('v-subheader',[_vm._v(\"Network parameters\")]),(!_vm.existingNetworks)?_c('v-card-text',[_vm._l((_vm.params.network),function(param){return _c('div',{key:param.name},[_c('v-text-field',{attrs:{\"label\":_vm.createLabel(param),\"required\":\"\"},model:{value:(param.value),callback:function ($$v) {_vm.$set(param, \"value\", $$v)},expression:\"param.value\"}})],1)}),_c('v-btn',{attrs:{\"color\":\"primary\"},on:{\"click\":_vm.getExistingNetworks}},[_vm._v(\"Or Select existing network\")])],2):_c('v-card-text',[_c('v-select',{attrs:{\"items\":_vm.existingNetworks,\"label\":\"Existing Networks\"},model:{value:(_vm.selectedNetwork),callback:function ($$v) {_vm.selectedNetwork=$$v},expression:\"selectedNetwork\"}}),_c('v-btn',{attrs:{\"color\":\"primary\"},on:{\"click\":function($event){_vm.existingNetworks=null}}},[_vm._v(\"Or Select new network\")])],1),_c('v-divider'),_c('v-subheader',[_vm._v(\"Map containers to parameter sets\")]),_c('v-card-text',_vm._l((_vm.instanceParamSets),function(value,key){return _c('v-text-field',{key:key,attrs:{\"label\":_vm.createReplicasLabel(key),\"required\":\"\"},model:{value:(_vm.instanceParamSets[key]),callback:function ($$v) {_vm.$set(_vm.instanceParamSets, key, $$v)},expression:\"instanceParamSets[key]\"}})}),1),_c('v-card-actions',[_c('v-layout',{attrs:{\"row\":\"\",\"justify-center\":\"\"}},[_c('v-dialog',{staticClass:\"mx-1\",attrs:{\"persistent\":\"\",\"max-width\":\"600px\"},model:{value:(_vm.permissions_error_dialog),callback:function ($$v) {_vm.permissions_error_dialog=$$v},expression:\"permissions_error_dialog\"}},[_c('v-btn',{attrs:{\"slot\":\"activator\",\"color\":\"primary\",\"dark\":\"\"},slot:\"activator\"},[_vm._v(\"Create Cluster\")]),_c('v-card',[_c('v-card-title',[_c('span',{staticClass:\"headline\"},[_vm._v(\"Terraform user credentials\")])]),_c('v-card-text',[_c('v-container',{attrs:{\"grid-list-md\":\"\"}},[_c('v-layout',{attrs:{\"wrap\":\"\"}},_vm._l((_vm.csp.requiredCredentials),function(credential){return _c('v-flex',{key:credential,attrs:{\"xs12\":\"\"}},[_c('v-text-field',{attrs:{\"label\":credential},model:{value:(_vm.credentialParameters[credential]),callback:function ($$v) {_vm.$set(_vm.credentialParameters, credential, $$v)},expression:\"credentialParameters[credential]\"}})],1)}),1)],1)],1),_c('v-card-actions',[_c('v-spacer'),_c('v-btn',{attrs:{\"color\":\"blue darken-1\",\"flat\":\"\"},on:{\"click\":function($event){_vm.permissions_error_dialog = false}}},[_vm._v(\"Cancel\")]),_c('v-btn',{attrs:{\"color\":\"blue darken-1\",\"flat\":\"\"},on:{\"click\":_vm.validateCredentials}},[_vm._v(\"OK\")])],1)],1)],1),_c('v-btn',{attrs:{\"color\":\"secondary\"},on:{\"click\":function($event){_vm.deployCluster(true)}}},[_vm._v(\"Download Terraform Templates\")])],1)],1)],1),(_vm.clusterCreated)?_c('div',[_c('h3',[_vm._v(\"Cluster created\")]),_vm._v(\"\\n Great job! The cluster is created. Terraform has created the following resources:\\n \"),_c('br'),_c('div',[_c('pre',[_vm._v(_vm._s(_vm._f(\"pretty\")(_vm.terraformResult)))])])]):_vm._e()],1),_c('v-dialog',{attrs:{\"persistent\":\"\",\"max-width\":\"600\"},model:{value:(_vm.policyValidationErrorDialog),callback:function ($$v) {_vm.policyValidationErrorDialog=$$v},expression:\"policyValidationErrorDialog\"}},[_c('v-card',[_c('v-card-title',{staticClass:\"headline\"},[_vm._v(\"Policy '\"+_vm._s(_vm.selectedPolicy)+\"' does not have the required permissions\\n \")]),_c('v-card-text',[_vm._v(\"Please select another policy or add to '\"+_vm._s(_vm.selectedPolicy)+\"' the following permissions:\\n \")]),_c('v-list',{attrs:{\"dense\":\"\"}},_vm._l((_vm.policyValidationError),function(permission){return _c('v-list-tile',{key:permission},[_c('v-list-tile-content',[_c('v-list-tile-title',{domProps:{\"textContent\":_vm._s(permission)}})],1)],1)}),1),_c('v-card-actions',[_c('v-spacer'),_c('v-btn',{attrs:{\"color\":\"green darken-1\",\"flat\":\"\"},on:{\"click\":function($event){_vm.policyValidationErrorDialog = false}}},[_vm._v(\"Close\")])],1)],1)],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\n <v-container v-if=\"params\" grid-list-md>\n <v-layout row wrap>\n\n <v-card class=\"text-md-center ma-3\">\n <v-card-title primary-title>\n <div>\n <h3 class=\"headline mb-0\">\n Please review cluster parameter values\n </h3>\n </div>\n </v-card-title>\n\n <v-divider></v-divider>\n <v-subheader>Cluster master parameters</v-subheader>\n <v-card-text>\n <div v-for=\"param in params.master\" :key=\"param.name\">\n <v-select v-if=\"param.range\"\n v-model=\"param.value\"\n :items=\"param.range\"\n :label=\"createLabel(param)\">\n </v-select>\n\n <v-text-field v-else\n v-model=\"param.value\"\n :label=\"createLabel(param)\"\n required>\n </v-text-field>\n </div>\n </v-card-text>\n\n <v-divider></v-divider>\n <v-subheader>Cluster nodes parameters</v-subheader>\n <v-card-text>\n <div v-for=\"param in params.nodes\" :key=\"param.name\">\n <v-select v-if=\"param.range\"\n v-model=\"param.value\"\n :items=\"param.range\"\n :label=\"createLabel(param)\">\n </v-select>\n\n <v-text-field v-else\n v-model=\"param.value\"\n :label=\"createLabel(param)\"\n required>\n </v-text-field>\n </div>\n </v-card-text>\n\n <div v-if=\"policies\">\n <v-divider></v-divider>\n <v-subheader>Policy to attach to cluster and worker nodes</v-subheader>\n <v-card-text>\n <v-select v-model=\"selectedPolicy\"\n :items=\"policies\"\n label=\"Existing Policies\"\n v-on:input=\"changeRoute()\">\n </v-select>\n </v-card-text>\n </div>\n\n <v-divider></v-divider>\n <v-subheader>Network parameters</v-subheader>\n <v-card-text v-if=\"!existingNetworks\">\n <div v-for=\"param in params.network\" :key=\"param.name\">\n <v-text-field\n v-model=\"param.value\"\n :label=\"createLabel(param)\"\n required>\n </v-text-field>\n </div>\n <v-btn @click=\"getExistingNetworks\" color=\"primary\">Or Select existing network</v-btn>\n </v-card-text>\n <v-card-text v-else>\n <v-select v-model=\"selectedNetwork\"\n :items=\"existingNetworks\"\n label=\"Existing Networks\">\n </v-select>\n <v-btn @click=\"existingNetworks=null\" color=\"primary\">Or Select new network</v-btn>\n </v-card-text>\n\n <v-divider></v-divider>\n <v-subheader>Map containers to parameter sets</v-subheader>\n <v-card-text>\n <v-text-field v-for=\"(value, key) in instanceParamSets\"\n v-model=\"instanceParamSets[key]\"\n :label=\"createReplicasLabel(key)\"\n :key=\"key\"\n required>\n </v-text-field>\n </v-card-text>\n\n <v-card-actions>\n <v-layout row justify-center>\n <v-dialog v-model=\"permissions_error_dialog\" persistent max-width=\"600px\" class=\"mx-1\">\n <v-btn slot=\"activator\" color=\"primary\" dark>Create Cluster</v-btn>\n <v-card>\n <v-card-title>\n <span class=\"headline\">Terraform user credentials</span>\n </v-card-title>\n <v-card-text>\n <v-container grid-list-md>\n <v-layout wrap>\n\n <v-flex xs12 v-for=\"credential in csp.requiredCredentials\"\n :key=\"credential\">\n <v-text-field v-model=\"credentialParameters[credential]\"\n :label=\"credential\"></v-text-field>\n </v-flex>\n </v-layout>\n </v-container>\n </v-card-text>\n <v-card-actions>\n <v-spacer></v-spacer>\n <v-btn color=\"blue darken-1\" flat @click=\"permissions_error_dialog = false\">Cancel</v-btn>\n <v-btn color=\"blue darken-1\" flat @click=\"validateCredentials\">OK</v-btn>\n </v-card-actions>\n\n </v-card>\n </v-dialog>\n <v-btn @click=\"deployCluster(true)\" color=\"secondary\">Download Terraform Templates</v-btn>\n </v-layout>\n </v-card-actions>\n </v-card>\n\n <div v-if=\"clusterCreated\">\n <h3>Cluster created</h3>\n Great job! The cluster is created. Terraform has created the following resources:\n <br/>\n\n <div>\n <pre>{{ terraformResult | pretty }}</pre>\n </div>\n </div>\n </v-layout>\n\n <v-dialog v-model=\"policyValidationErrorDialog\" persistent max-width=\"600\">\n <v-card>\n <v-card-title class=\"headline\">Policy '{{selectedPolicy}}' does not have the required permissions\n </v-card-title>\n <v-card-text>Please select another policy or add to '{{selectedPolicy}}' the following permissions:\n </v-card-text>\n <v-list dense>\n <v-list-tile\n v-for=\"permission in policyValidationError\"\n :key=\"permission\">\n\n <v-list-tile-content>\n <v-list-tile-title v-text=\"permission\"></v-list-tile-title>\n </v-list-tile-content>\n\n </v-list-tile>\n </v-list>\n <v-card-actions>\n <v-spacer></v-spacer>\n <v-btn color=\"green darken-1\" flat @click=\"policyValidationErrorDialog = false\">Close</v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n\n </v-container>\n\n</template>\n\n<script>\n export default {\n data() {\n return {\n csp: this.$route.params.csp,\n paramSets: this.$route.params.paramSets,\n valid: true,\n clusterCreated: false,\n terraformResult: null,\n permissions_error_dialog: false,\n existingNetworks: null,\n selectedNetwork: null,\n policies: null,\n selectedPolicy: null,\n policyValidationErrorDialog: false,\n policyValidationError: [],\n credentialParameters: {},\n params: null,\n instanceParamSets: {}\n }\n },\n methods: {\n createLabel(param) {\n return param.name + ' (' + param.description + ')';\n },\n createReplicasLabel(paramSetName) {\n return 'Number of containers using ' + paramSetName;\n },\n getExistingNetworks() {\n this.$http.get('networks/' + this.csp.name)\n .then(response => {\n console.log(response);\n this.existingNetworks = response.data;\n }, response => {\n console.log(response);\n alert(response.data);\n });\n },\n validateCredentials() {\n this.credentialParameters['region'] = this.csp.region;\n const payload = {\n csp: this.csp.name,\n parameters: this.credentialParameters\n };\n console.log(payload);\n this.$http.post('credentials', payload)\n .then(response => {\n console.log(response);\n this.permissions_error_dialog = false;\n this.deployCluster(false);\n }, response => {\n console.log(response);\n alert(response.data);\n });\n },\n changeRoute() {\n console.log(this.selectedPolicy);\n const payload = {\n csp: this.csp.name,\n parameters: {\n policy: this.selectedPolicy\n }\n };\n this.$http.post('policy/validate', payload)\n .then(response => {\n console.log(response.data);\n if (response.data.notAllowedActions.length > 0) {\n this.policyValidationErrorDialog = true;\n this.policyValidationError = response.data.notAllowedActions;\n }\n }, response => {\n alert(response.data);\n });\n },\n deployCluster(downloadFormsOnly) {\n const parameters = {};\n for (let key in this.params.master) {\n let param = this.params.master[key];\n parameters[param.name] = param.value;\n }\n\n for (let key in this.params.nodes) {\n let param = this.params.nodes[key];\n parameters[param.name] = param.value;\n }\n\n if (this.selectedNetwork) {\n parameters['existing-network-name'] = this.selectedNetwork;\n } else {\n for (let key in this.params.network) {\n let param = this.params.network[key];\n parameters[param.name] = param.value;\n }\n }\n\n let containersPerParamSet = Object.keys(this.instanceParamSets)\n .map(k => k + ':' + this.instanceParamSets[k])\n .join(\",\");\n parameters['containersPerParamSet'] = containersPerParamSet;\n\n if (this.selectedPolicy) {\n parameters['jemo-policy-name'] = this.selectedPolicy;\n }\n\n this.$router.push({\n name: 'create-cluster',\n params: {csp: this.csp, parameters: parameters, downloadFormsOnly: downloadFormsOnly}\n })\n },\n init() {\n this.$http.get('cluster/params/' + this.csp.name)\n .then(response => {\n console.log(response);\n this.params = response.data;\n\n let workstationExternalCidr = this.params.master.find(param => param.name === 'workstation-external-cidr');\n if (workstationExternalCidr) {\n this.$http.get('https://ipv4.icanhazip.com')\n .then(response => {\n console.log(response);\n workstationExternalCidr.value = response.data.trim() + '/32';\n }, response => {\n console.log(\"Can not find local ip\");\n console.log(response);\n });\n }\n }, response => {\n console.log(response);\n });\n\n this.$http.get('policy/' + this.csp.name)\n .then(response => {\n console.log(response);\n this.policies = response.data;\n if (this.policies && this.policies.includes('jemo-policy')) {\n this.selectedPolicy = 'jemo-policy';\n }\n }, response => {\n console.log(response);\n });\n\n this.paramSets.forEach(paramSet => this.instanceParamSets[paramSet.name] = 0);\n }\n },\n created() {\n this.init();\n },\n watch: {\n '$route'(to) {\n if (to.name === 'prod-conf') {\n this.csp = to.params.csp ? to.params.csp : this.csp;\n this.paramSets = to.params.paramSets ? to.params.paramSets : this.paramSets;\n\n if (to.params.csp.name !== this.csp.name) {\n this.init();\n } else {\n this.paramSets.forEach(paramSet => this.instanceParamSets[paramSet.name] = 0);\n }\n }\n }\n },\n }\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/vuetify-loader/lib/loader.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ProdConf.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/vuetify-loader/lib/loader.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ProdConf.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ProdConf.vue?vue&type=template&id=5f716446&\"\nimport script from \"./ProdConf.vue?vue&type=script&lang=js&\"\nexport * from \"./ProdConf.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"ProdConf.vue\"\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib'\nimport { VCard } from 'vuetify/lib'\nimport { VCardActions } from 'vuetify/lib'\nimport { VCardText } from 'vuetify/lib'\nimport { VCardTitle } from 'vuetify/lib'\nimport { VContainer } from 'vuetify/lib'\nimport { VDialog } from 'vuetify/lib'\nimport { VDivider } from 'vuetify/lib'\nimport { VFlex } from 'vuetify/lib'\nimport { VLayout } from 'vuetify/lib'\nimport { VList } from 'vuetify/lib'\nimport { VListTile } from 'vuetify/lib'\nimport { VListTileContent } from 'vuetify/lib'\nimport { VListTileTitle } from 'vuetify/lib'\nimport { VSelect } from 'vuetify/lib'\nimport { VSpacer } from 'vuetify/lib'\nimport { VSubheader } from 'vuetify/lib'\nimport { VTextField } from 'vuetify/lib'\ninstallComponents(component, {\n VBtn,\n VCard,\n VCardActions,\n VCardText,\n VCardTitle,\n VContainer,\n VDialog,\n VDivider,\n VFlex,\n VLayout,\n VList,\n VListTile,\n VListTileContent,\n VListTileTitle,\n VSelect,\n VSpacer,\n VSubheader,\n VTextField,\n})\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///./node_modules/core-js/library/modules/_has.js","webpack:///./node_modules/core-js/modules/_array-methods.js","webpack:///./node_modules/core-js/library/modules/_to-absolute-index.js","webpack:///./node_modules/core-js/modules/_is-array.js","webpack:///./node_modules/core-js/library/modules/_enum-bug-keys.js","webpack:///./node_modules/vuetify/lib/mixins/overlayable.js","webpack:///./node_modules/vuetify/lib/components/VDialog/VDialog.js","webpack:///./node_modules/core-js/library/modules/_to-primitive.js","webpack:///./node_modules/core-js/library/modules/_dom-create.js","webpack:///./node_modules/core-js/library/modules/_to-object.js","webpack:///./node_modules/core-js/library/modules/_defined.js","webpack:///./node_modules/vuetify/lib/components/VTextarea/VTextarea.js","webpack:///./node_modules/vuetify/lib/components/VTextField/index.js","webpack:///./node_modules/core-js/library/modules/_fails.js","webpack:///./node_modules/core-js/modules/_strict-method.js","webpack:///./node_modules/core-js/modules/es6.string.includes.js","webpack:///./node_modules/core-js/library/modules/es6.object.keys.js","webpack:///./node_modules/core-js/library/modules/_iobject.js","webpack:///./node_modules/core-js/library/modules/_hide.js","webpack:///./node_modules/core-js/library/modules/_to-iobject.js","webpack:///./node_modules/core-js/library/modules/_to-integer.js","webpack:///./node_modules/core-js/modules/es6.string.trim.js","webpack:///./node_modules/core-js/modules/_fails-is-regexp.js","webpack:///./node_modules/core-js/library/modules/_shared-key.js","webpack:///./node_modules/core-js/library/modules/_core.js","webpack:///./node_modules/core-js/library/modules/_array-includes.js","webpack:///./node_modules/core-js/library/modules/_uid.js","webpack:///./node_modules/core-js/library/modules/_export.js","webpack:///./node_modules/core-js/modules/es7.array.includes.js","webpack:///./node_modules/core-js/library/modules/_cof.js","webpack:///./node_modules/core-js/modules/es6.array.map.js","webpack:///./node_modules/core-js/modules/es6.array.find.js","webpack:///./node_modules/core-js/library/modules/_ie8-dom-define.js","webpack:///./node_modules/core-js/library/modules/_a-function.js","webpack:///./node_modules/core-js/library/fn/object/keys.js","webpack:///./node_modules/core-js/library/modules/_descriptors.js","webpack:///./node_modules/@babel/runtime-corejs2/core-js/object/keys.js","webpack:///./node_modules/core-js/modules/_string-trim.js","webpack:///./node_modules/core-js/modules/_is-regexp.js","webpack:///./node_modules/core-js/modules/web.dom.iterable.js","webpack:///./node_modules/core-js/library/modules/_property-desc.js","webpack:///./node_modules/core-js/library/modules/_to-length.js","webpack:///./node_modules/core-js/library/modules/_library.js","webpack:///./node_modules/core-js/library/modules/_object-keys.js","webpack:///./node_modules/core-js/modules/_array-species-create.js","webpack:///./node_modules/core-js/library/modules/_object-sap.js","webpack:///./node_modules/core-js/modules/_string-context.js","webpack:///./node_modules/core-js/library/modules/_ctx.js","webpack:///./node_modules/core-js/library/modules/_object-dp.js","webpack:///./node_modules/core-js/library/modules/_shared.js","webpack:///./node_modules/core-js/library/modules/_an-object.js","webpack:///./node_modules/core-js/library/modules/_global.js","webpack:///./node_modules/core-js/library/modules/_object-keys-internal.js","webpack:///./node_modules/core-js/modules/_array-species-constructor.js","webpack:///./node_modules/core-js/modules/es6.array.for-each.js","webpack:///./src/views/ProdConf.vue?7452","webpack:///src/views/ProdConf.vue","webpack:///./src/views/ProdConf.vue?3134","webpack:///./src/views/ProdConf.vue","webpack:///./node_modules/core-js/library/modules/_is-object.js","webpack:///./node_modules/core-js/modules/_string-ws.js"],"names":["hasOwnProperty","module","exports","it","key","call","ctx","__webpack_require__","IObject","toObject","toLength","asc","TYPE","$create","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","create","$this","callbackfn","that","val","res","O","self","f","length","index","result","undefined","push","toInteger","max","Math","min","cof","Array","isArray","arg","split","overlayable","name","props","hideOverlay","Boolean","data","overlay","overlayOffset","overlayTimeout","overlayTransitionDuration","beforeDestroy","this","removeOverlay","methods","genOverlay","_this","isActive","clearTimeout","classList","add","document","createElement","className","absolute","hideScroll","parent","$el","parentNode","querySelector","insertBefore","firstChild","clientHeight","requestAnimationFrame","activeZIndex","style","zIndex","_this2","showScroll","arguments","remove","setTimeout","removeChild","e","console","log","scrollListener","type","includes","target","tagName","isContentEditable","up","helpers","pageup","down","pagedown","keyCode","deltaY","body","checkPath","preventDefault","hasScrollbar","el","nodeType","Node","ELEMENT_NODE","window","getComputedStyle","scrollHeight","shouldScroll","delta","scrollTop","isInside","path","composedPath","wheelDelta","dialog","$refs","selected","getSelection","anchorNode","documentElement","content","parentElement","$vuetify","breakpoint","smAndDown","addEventListener","removeEventListener","_extends","Object","assign","i","source","prototype","_defineProperty","obj","value","defineProperty","enumerable","configurable","writable","__webpack_exports__","directives","ClickOutside","click_outside","mixins","dependent","detachable","returnable","stackable","toggleable","disabled","persistent","fullscreen","fullWidth","noClickAnimation","light","dark","maxWidth","String","Number","default","origin","width","scrollable","transition","animate","animateTimeout","stackClass","stackMinZIndex","computed","classes","_ref","contentClass","trim","contentClasses","v-dialog__content","v-dialog__content--active","watch","show","unbind","beforeMount","$nextTick","isBooted","animateClick","closeConditional","contains","getMaxZIndex","focus","$listeners","keydown","bind","onKeydown","$emit","genActivator","_this3","$slots","activator","$scopedSlots","listeners","click","stopPropagation","on","activatorNode","$createElement","staticClass","class","v-dialog__activator--disabled","render","h","_this4","children","ref","args","include","getOpenDependentElements","showLazyContent","attrs","tabIndex","getScopeIdAttrs","ThemeProvider","root","display","isObject","S","fn","toString","valueOf","TypeError","is","defined","VTextarea","extends","VTextField","autoGrow","noResize","outline","rowHeight","validator","v","isNaN","parseFloat","rows","parseInt","v-textarea","v-textarea--auto-grow","v-textarea--no-resize","noResizeHandle","options","dynamicHeight","inputHeight","isEnclosed","textarea","lazyValue","internalChange","calculateInputHeight","mounted","input","height","minHeight","genInput","tag","onInput","onKeyDown","isFocused","d","wrapper","functional","$_wrapperFor","multiLine","slots","dedupeModelListeners","rebuildFunctionalSlots","exec","fails","method","$export","context","INCLUDES","P","F","searchString","indexOf","$keys","propertyIsEnumerable","dP","createDesc","object","ceil","floor","$trim","MATCH","KEY","re","shared","uid","core","version","__e","toIObject","toAbsoluteIndex","IS_INCLUDES","fromIndex","id","px","random","concat","global","hide","has","PROTOTYPE","own","out","IS_FORCED","IS_GLOBAL","G","IS_STATIC","IS_PROTO","IS_BIND","B","IS_WRAP","W","expProto","C","a","b","c","apply","Function","virtual","R","U","$includes","slice","$map","map","$find","forced","find","get","keys","spaces","space","non","ltrim","RegExp","rtrim","exporter","ALIAS","exp","FORCE","string","replace","isRegExp","$iterators","getKeys","redefine","Iterators","wks","ITERATOR","TO_STRING_TAG","ArrayValues","DOMIterables","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","collections","NAME","explicit","Collection","proto","bitmap","enumBugKeys","speciesConstructor","original","aFunction","anObject","IE8_DOM_DEFINE","toPrimitive","Attributes","SHARED","store","mode","copyright","__g","arrayIndexOf","IE_PROTO","names","SPECIES","constructor","$forEach","STRICT","forEach","_vm","_h","_c","_self","grid-list-md","row","wrap","primary-title","_v","_l","params","param","items","range","label","createLabel","model","callback","$$v","$set","expression","required","policies","$event","changeRoute","selectedPolicy","_e","network","existingNetworks","selectedNetwork","color","getExistingNetworks","createReplicasLabel","instanceParamSets","justify-center","max-width","permissions_error_dialog","slot","csp","credential","xs12","credentialParameters","flat","validateCredentials","deployCluster","_s","_f","terraformResult","policyValidationErrorDialog","dense","permission","domProps","textContent","staticRenderFns","ProdConfvue_type_script_lang_js_","$route","paramSets","valid","clusterCreated","policyValidationError","description","paramSetName","$http","then","response","alert","region","payload","parameters","post","policy","notAllowedActions","downloadFormsOnly","master","_key","nodes","_param","_key2","_param2","containersPerParamSet","keys_default","k","join","$router","init","_this5","workstationExternalCidr","paramSet","created","to","_this6","views_ProdConfvue_type_script_lang_js_","component","componentNormalizer","__file","installComponents_default","VBtn","VCard","VCardActions","components_VCard","VCardText","VCardTitle","VContainer","VDialog","VDivider","VFlex","VLayout","VList","VListTile","VListTileContent","components_VList","VListTileTitle","VSelect","VSpacer","VGrid","VSubheader"],"mappings":"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","file":"js/chunk-975357a2.a9960b1d.js","sourcesContent":["var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","import '../../src/stylus/components/_overlay.styl';\n// Utils\nimport { keyCodes } from '../util/helpers';\n/* @vue/component */\nexport default {\n name: 'overlayable',\n props: {\n hideOverlay: Boolean\n },\n data: function data() {\n return {\n overlay: null,\n overlayOffset: 0,\n overlayTimeout: null,\n overlayTransitionDuration: 500 + 150 // transition + delay\n };\n },\n beforeDestroy: function beforeDestroy() {\n this.removeOverlay();\n },\n\n methods: {\n genOverlay: function genOverlay() {\n var _this = this;\n\n // If fn is called and timeout is active\n // or overlay already exists\n // cancel removal of overlay and re-add active\n if (!this.isActive || this.hideOverlay || this.isActive && this.overlayTimeout || this.overlay) {\n clearTimeout(this.overlayTimeout);\n return this.overlay && this.overlay.classList.add('v-overlay--active');\n }\n this.overlay = document.createElement('div');\n this.overlay.className = 'v-overlay';\n if (this.absolute) this.overlay.className += ' v-overlay--absolute';\n this.hideScroll();\n var parent = this.absolute ? this.$el.parentNode : document.querySelector('[data-app]');\n parent && parent.insertBefore(this.overlay, parent.firstChild);\n // eslint-disable-next-line no-unused-expressions\n this.overlay.clientHeight; // Force repaint\n requestAnimationFrame(function () {\n // https://github.com/vuetifyjs/vuetify/issues/4678\n if (!_this.overlay) return;\n _this.overlay.className += ' v-overlay--active';\n if (_this.activeZIndex !== undefined) {\n _this.overlay.style.zIndex = _this.activeZIndex - 1;\n }\n });\n return true;\n },\n\n /** removeOverlay(false) will not restore the scollbar afterwards */\n removeOverlay: function removeOverlay() {\n var _this2 = this;\n\n var showScroll = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n if (!this.overlay) {\n return showScroll && this.showScroll();\n }\n this.overlay.classList.remove('v-overlay--active');\n this.overlayTimeout = setTimeout(function () {\n // IE11 Fix\n try {\n if (_this2.overlay && _this2.overlay.parentNode) {\n _this2.overlay.parentNode.removeChild(_this2.overlay);\n }\n _this2.overlay = null;\n showScroll && _this2.showScroll();\n } catch (e) {\n console.log(e);\n }\n clearTimeout(_this2.overlayTimeout);\n _this2.overlayTimeout = null;\n }, this.overlayTransitionDuration);\n },\n\n /**\n * @param {Event} e\n * @returns void\n */\n scrollListener: function scrollListener(e) {\n if (e.type === 'keydown') {\n if (['INPUT', 'TEXTAREA', 'SELECT'].includes(e.target.tagName) ||\n // https://github.com/vuetifyjs/vuetify/issues/4715\n e.target.isContentEditable) return;\n var up = [keyCodes.up, keyCodes.pageup];\n var down = [keyCodes.down, keyCodes.pagedown];\n if (up.includes(e.keyCode)) {\n e.deltaY = -1;\n } else if (down.includes(e.keyCode)) {\n e.deltaY = 1;\n } else {\n return;\n }\n }\n if (e.target === this.overlay || e.type !== 'keydown' && e.target === document.body || this.checkPath(e)) e.preventDefault();\n },\n hasScrollbar: function hasScrollbar(el) {\n if (!el || el.nodeType !== Node.ELEMENT_NODE) return false;\n var style = window.getComputedStyle(el);\n return ['auto', 'scroll'].includes(style['overflow-y']) && el.scrollHeight > el.clientHeight;\n },\n shouldScroll: function shouldScroll(el, delta) {\n if (el.scrollTop === 0 && delta < 0) return true;\n return el.scrollTop + el.clientHeight === el.scrollHeight && delta > 0;\n },\n isInside: function isInside(el, parent) {\n if (el === parent) {\n return true;\n } else if (el === null || el === document.body) {\n return false;\n } else {\n return this.isInside(el.parentNode, parent);\n }\n },\n\n /**\n * @param {Event} e\n * @returns boolean\n */\n checkPath: function checkPath(e) {\n var path = e.path || this.composedPath(e);\n var delta = e.deltaY || -e.wheelDelta;\n if (e.type === 'keydown' && path[0] === document.body) {\n var dialog = this.$refs.dialog;\n var selected = window.getSelection().anchorNode;\n if (this.hasScrollbar(dialog) && this.isInside(selected, dialog)) {\n return this.shouldScroll(dialog, delta);\n }\n return true;\n }\n for (var index = 0; index < path.length; index++) {\n var el = path[index];\n if (el === document) return true;\n if (el === document.documentElement) return true;\n if (el === this.$refs.content) return true;\n if (this.hasScrollbar(el)) return this.shouldScroll(el, delta);\n }\n return true;\n },\n\n /**\n * Polyfill for Event.prototype.composedPath\n * @param {Event} e\n * @returns Element[]\n */\n composedPath: function composedPath(e) {\n if (e.composedPath) return e.composedPath();\n var path = [];\n var el = e.target;\n while (el) {\n path.push(el);\n if (el.tagName === 'HTML') {\n path.push(document);\n path.push(window);\n return path;\n }\n el = el.parentElement;\n }\n },\n hideScroll: function hideScroll() {\n if (this.$vuetify.breakpoint.smAndDown) {\n document.documentElement.classList.add('overflow-y-hidden');\n } else {\n window.addEventListener('wheel', this.scrollListener);\n window.addEventListener('keydown', this.scrollListener);\n }\n },\n showScroll: function showScroll() {\n document.documentElement.classList.remove('overflow-y-hidden');\n window.removeEventListener('wheel', this.scrollListener);\n window.removeEventListener('keydown', this.scrollListener);\n }\n }\n};\n//# sourceMappingURL=overlayable.js.map","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nimport '../../../src/stylus/components/_dialogs.styl';\n// Mixins\nimport Dependent from '../../mixins/dependent';\nimport Detachable from '../../mixins/detachable';\nimport Overlayable from '../../mixins/overlayable';\nimport Returnable from '../../mixins/returnable';\nimport Stackable from '../../mixins/stackable';\nimport Toggleable from '../../mixins/toggleable';\n// Directives\nimport ClickOutside from '../../directives/click-outside';\n// Helpers\nimport { getZIndex, convertToUnit } from '../../util/helpers';\nimport ThemeProvider from '../../util/ThemeProvider';\n/* @vue/component */\nexport default {\n name: 'v-dialog',\n directives: {\n ClickOutside: ClickOutside\n },\n mixins: [Dependent, Detachable, Overlayable, Returnable, Stackable, Toggleable],\n props: {\n disabled: Boolean,\n persistent: Boolean,\n fullscreen: Boolean,\n fullWidth: Boolean,\n noClickAnimation: Boolean,\n light: Boolean,\n dark: Boolean,\n maxWidth: {\n type: [String, Number],\n default: 'none'\n },\n origin: {\n type: String,\n default: 'center center'\n },\n width: {\n type: [String, Number],\n default: 'auto'\n },\n scrollable: Boolean,\n transition: {\n type: [String, Boolean],\n default: 'dialog-transition'\n }\n },\n data: function data() {\n return {\n animate: false,\n animateTimeout: null,\n stackClass: 'v-dialog__content--active',\n stackMinZIndex: 200\n };\n },\n\n computed: {\n classes: function classes() {\n var _ref;\n\n return _ref = {}, _defineProperty(_ref, ('v-dialog ' + this.contentClass).trim(), true), _defineProperty(_ref, 'v-dialog--active', this.isActive), _defineProperty(_ref, 'v-dialog--persistent', this.persistent), _defineProperty(_ref, 'v-dialog--fullscreen', this.fullscreen), _defineProperty(_ref, 'v-dialog--scrollable', this.scrollable), _defineProperty(_ref, 'v-dialog--animated', this.animate), _ref;\n },\n contentClasses: function contentClasses() {\n return {\n 'v-dialog__content': true,\n 'v-dialog__content--active': this.isActive\n };\n }\n },\n watch: {\n isActive: function isActive(val) {\n if (val) {\n this.show();\n this.hideScroll();\n } else {\n this.removeOverlay();\n this.unbind();\n }\n },\n fullscreen: function fullscreen(val) {\n if (!this.isActive) return;\n if (val) {\n this.hideScroll();\n this.removeOverlay(false);\n } else {\n this.showScroll();\n this.genOverlay();\n }\n }\n },\n beforeMount: function beforeMount() {\n var _this = this;\n\n this.$nextTick(function () {\n _this.isBooted = _this.isActive;\n _this.isActive && _this.show();\n });\n },\n beforeDestroy: function beforeDestroy() {\n if (typeof window !== 'undefined') this.unbind();\n },\n\n methods: {\n animateClick: function animateClick() {\n var _this2 = this;\n\n this.animate = false;\n // Needed for when clicking very fast\n // outside of the dialog\n this.$nextTick(function () {\n _this2.animate = true;\n clearTimeout(_this2.animateTimeout);\n _this2.animateTimeout = setTimeout(function () {\n return _this2.animate = false;\n }, 150);\n });\n },\n closeConditional: function closeConditional(e) {\n // If the dialog content contains\n // the click event, or if the\n // dialog is not active\n if (this.$refs.content.contains(e.target) || !this.isActive) return false;\n // If we made it here, the click is outside\n // and is active. If persistent, and the\n // click is on the overlay, animate\n if (this.persistent) {\n if (!this.noClickAnimation && this.overlay === e.target) this.animateClick();\n return false;\n }\n // close dialog if !persistent, clicked outside and we're the topmost dialog.\n // Since this should only be called in a capture event (bottom up), we shouldn't need to stop propagation\n return getZIndex(this.$refs.content) >= this.getMaxZIndex();\n },\n hideScroll: function hideScroll() {\n if (this.fullscreen) {\n document.documentElement.classList.add('overflow-y-hidden');\n } else {\n Overlayable.methods.hideScroll.call(this);\n }\n },\n show: function show() {\n !this.fullscreen && !this.hideOverlay && this.genOverlay();\n this.$refs.content.focus();\n this.$listeners.keydown && this.bind();\n },\n bind: function bind() {\n window.addEventListener('keydown', this.onKeydown);\n },\n unbind: function unbind() {\n window.removeEventListener('keydown', this.onKeydown);\n },\n onKeydown: function onKeydown(e) {\n this.$emit('keydown', e);\n },\n genActivator: function genActivator() {\n var _this3 = this;\n\n if (!this.$slots.activator && !this.$scopedSlots.activator) return null;\n var listeners = this.disabled ? {} : {\n click: function click(e) {\n e.stopPropagation();\n if (!_this3.disabled) _this3.isActive = !_this3.isActive;\n }\n };\n if (this.$scopedSlots.activator) {\n var activator = this.$scopedSlots.activator({ on: listeners });\n this.activatorNode = activator;\n return activator;\n }\n return this.$createElement('div', {\n staticClass: 'v-dialog__activator',\n 'class': {\n 'v-dialog__activator--disabled': this.disabled\n },\n on: listeners\n }, [this.$slots.activator]);\n }\n },\n render: function render(h) {\n var _this4 = this;\n\n var children = [];\n var data = {\n 'class': this.classes,\n ref: 'dialog',\n directives: [{\n name: 'click-outside',\n value: function value() {\n return _this4.isActive = false;\n },\n args: {\n closeConditional: this.closeConditional,\n include: this.getOpenDependentElements\n }\n }, { name: 'show', value: this.isActive }],\n on: {\n click: function click(e) {\n e.stopPropagation();\n }\n }\n };\n if (!this.fullscreen) {\n data.style = {\n maxWidth: this.maxWidth === 'none' ? undefined : convertToUnit(this.maxWidth),\n width: this.width === 'auto' ? undefined : convertToUnit(this.width)\n };\n }\n children.push(this.genActivator());\n var dialog = h('div', data, this.showLazyContent(this.$slots.default));\n if (this.transition) {\n dialog = h('transition', {\n props: {\n name: this.transition,\n origin: this.origin\n }\n }, [dialog]);\n }\n children.push(h('div', {\n 'class': this.contentClasses,\n attrs: _extends({\n tabIndex: '-1'\n }, this.getScopeIdAttrs()),\n style: { zIndex: this.activeZIndex },\n ref: 'content'\n }, [this.$createElement(ThemeProvider, {\n props: {\n root: true,\n light: this.light,\n dark: this.dark\n }\n }, [dialog])]));\n return h('div', {\n staticClass: 'v-dialog__container',\n style: {\n display: !this.$slots.activator || this.fullWidth ? 'block' : 'inline-block'\n }\n }, children);\n }\n};\n//# sourceMappingURL=VDialog.js.map","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n// Styles\nimport '../../../src/stylus/components/_textarea.styl';\n// Extensions\nimport VTextField from '../VTextField/VTextField';\nimport { consoleInfo } from '../../util/console';\n/* @vue/component */\nexport default {\n name: 'v-textarea',\n extends: VTextField,\n props: {\n autoGrow: Boolean,\n noResize: Boolean,\n outline: Boolean,\n rowHeight: {\n type: [Number, String],\n default: 24,\n validator: function validator(v) {\n return !isNaN(parseFloat(v));\n }\n },\n rows: {\n type: [Number, String],\n default: 5,\n validator: function validator(v) {\n return !isNaN(parseInt(v, 10));\n }\n }\n },\n computed: {\n classes: function classes() {\n return _extends({\n 'v-textarea': true,\n 'v-textarea--auto-grow': this.autoGrow,\n 'v-textarea--no-resize': this.noResizeHandle\n }, VTextField.options.computed.classes.call(this, null));\n },\n dynamicHeight: function dynamicHeight() {\n return this.autoGrow ? this.inputHeight : 'auto';\n },\n isEnclosed: function isEnclosed() {\n return this.textarea || VTextField.options.computed.isEnclosed.call(this);\n },\n noResizeHandle: function noResizeHandle() {\n return this.noResize || this.autoGrow;\n }\n },\n watch: {\n lazyValue: function lazyValue() {\n !this.internalChange && this.autoGrow && this.$nextTick(this.calculateInputHeight);\n }\n },\n mounted: function mounted() {\n var _this = this;\n\n setTimeout(function () {\n _this.autoGrow && _this.calculateInputHeight();\n }, 0);\n // TODO: remove (2.0)\n if (this.autoGrow && this.noResize) {\n consoleInfo('\"no-resize\" is now implied when using \"auto-grow\", and can be removed', this);\n }\n },\n\n methods: {\n calculateInputHeight: function calculateInputHeight() {\n var input = this.$refs.input;\n if (input) {\n input.style.height = 0;\n var height = input.scrollHeight;\n var minHeight = parseInt(this.rows, 10) * parseFloat(this.rowHeight);\n // This has to be done ASAP, waiting for Vue\n // to update the DOM causes ugly layout jumping\n input.style.height = Math.max(minHeight, height) + 'px';\n }\n },\n genInput: function genInput() {\n var input = VTextField.options.methods.genInput.call(this);\n input.tag = 'textarea';\n delete input.data.attrs.type;\n input.data.attrs.rows = this.rows;\n return input;\n },\n onInput: function onInput(e) {\n VTextField.options.methods.onInput.call(this, e);\n this.autoGrow && this.calculateInputHeight();\n },\n onKeyDown: function onKeyDown(e) {\n // Prevents closing of a\n // dialog when pressing\n // enter\n if (this.isFocused && e.keyCode === 13) {\n e.stopPropagation();\n }\n this.internalChange = true;\n this.$emit('keydown', e);\n }\n }\n};\n//# sourceMappingURL=VTextarea.js.map","import VTextField from './VTextField';\nimport VTextarea from '../VTextarea/VTextarea';\nimport rebuildSlots from '../../util/rebuildFunctionalSlots';\nimport dedupeModelListeners from '../../util/dedupeModelListeners';\nimport { deprecate } from '../../util/console';\n// TODO: remove this in v2.0\n/* @vue/component */\nvar wrapper = {\n functional: true,\n $_wrapperFor: VTextField,\n props: {\n textarea: Boolean,\n multiLine: Boolean\n },\n render: function render(h, _ref) {\n var props = _ref.props,\n data = _ref.data,\n slots = _ref.slots,\n parent = _ref.parent;\n\n dedupeModelListeners(data);\n var children = rebuildSlots(slots(), h);\n if (props.textarea) {\n deprecate('<v-text-field textarea>', '<v-textarea outline>', wrapper, parent);\n }\n if (props.multiLine) {\n deprecate('<v-text-field multi-line>', '<v-textarea>', wrapper, parent);\n }\n if (props.textarea || props.multiLine) {\n data.attrs.outline = props.textarea;\n return h(VTextarea, data, children);\n } else {\n return h(VTextField, data, children);\n }\n }\n};\nexport { wrapper as VTextField };\nexport default wrapper;\n//# sourceMappingURL=index.js.map","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","'use strict';\nvar fails = require('./_fails');\n\nmodule.exports = function (method, arg) {\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call\n arg ? method.call(null, function () { /* empty */ }, 1) : method.call(null);\n });\n};\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","'use strict';\n// 21.1.3.25 String.prototype.trim()\nrequire('./_string-trim')('trim', function ($trim) {\n return function trim() {\n return $trim(this, 3);\n };\n});\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var core = module.exports = { version: '2.6.1' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar ctx = require('./_ctx');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var IS_WRAP = type & $export.W;\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE];\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];\n var key, own, out;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n if (own && has(exports, key)) continue;\n // export native or passed\n out = own ? target[key] : source[key];\n // prevent global pollution for namespaces\n exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n // bind timers to global for call from export context\n : IS_BIND && own ? ctx(out, global)\n // wrap global constructors for prevent change them in library\n : IS_WRAP && target[key] == out ? (function (C) {\n var F = function (a, b, c) {\n if (this instanceof C) {\n switch (arguments.length) {\n case 0: return new C();\n case 1: return new C(a);\n case 2: return new C(a, b);\n } return new C(a, b, c);\n } return C.apply(this, arguments);\n };\n F[PROTOTYPE] = C[PROTOTYPE];\n return F;\n // make static versions for prototype methods\n })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n if (IS_PROTO) {\n (exports.virtual || (exports.virtual = {}))[key] = out;\n // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);\n }\n }\n};\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","'use strict';\nvar $export = require('./_export');\nvar $map = require('./_array-methods')(1);\n\n$export($export.P + $export.F * !require('./_strict-method')([].map, true), 'Array', {\n // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments[1]);\n }\n});\n","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","require('../../modules/es6.object.keys');\nmodule.exports = require('../../modules/_core').Object.keys;\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","module.exports = require(\"core-js/library/fn/object/keys\");","var $export = require('./_export');\nvar defined = require('./_defined');\nvar fails = require('./_fails');\nvar spaces = require('./_string-ws');\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","module.exports = true;\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\n});\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","'use strict';\nvar $export = require('./_export');\nvar $forEach = require('./_array-methods')(0);\nvar STRICT = require('./_strict-method')([].forEach, true);\n\n$export($export.P + $export.F * !STRICT, 'Array', {\n // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])\n forEach: function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments[1]);\n }\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.params)?_c('v-container',{attrs:{\"grid-list-md\":\"\"}},[_c('v-layout',{attrs:{\"row\":\"\",\"wrap\":\"\"}},[_c('v-card',{staticClass:\"text-md-center ma-3\"},[_c('v-card-title',{attrs:{\"primary-title\":\"\"}},[_c('div',[_c('h3',{staticClass:\"headline mb-0\"},[_vm._v(\"\\n Please review cluster parameter values\\n \")])])]),_c('v-divider'),_c('v-subheader',[_vm._v(\"Cluster master parameters\")]),_c('v-card-text',_vm._l((_vm.params.master),function(param){return _c('div',{key:param.name},[(param.range)?_c('v-select',{attrs:{\"items\":param.range,\"label\":_vm.createLabel(param)},model:{value:(param.value),callback:function ($$v) {_vm.$set(param, \"value\", $$v)},expression:\"param.value\"}}):_c('v-text-field',{attrs:{\"label\":_vm.createLabel(param),\"required\":\"\"},model:{value:(param.value),callback:function ($$v) {_vm.$set(param, \"value\", $$v)},expression:\"param.value\"}})],1)}),0),_c('v-divider'),_c('v-subheader',[_vm._v(\"Cluster nodes parameters\")]),_c('v-card-text',_vm._l((_vm.params.nodes),function(param){return _c('div',{key:param.name},[(param.range)?_c('v-select',{attrs:{\"items\":param.range,\"label\":_vm.createLabel(param)},model:{value:(param.value),callback:function ($$v) {_vm.$set(param, \"value\", $$v)},expression:\"param.value\"}}):_c('v-text-field',{attrs:{\"label\":_vm.createLabel(param),\"required\":\"\"},model:{value:(param.value),callback:function ($$v) {_vm.$set(param, \"value\", $$v)},expression:\"param.value\"}})],1)}),0),(_vm.policies)?_c('div',[_c('v-divider'),_c('v-subheader',[_vm._v(\"Policy to attach to cluster and worker nodes\")]),_c('v-card-text',[_c('v-select',{attrs:{\"items\":_vm.policies,\"label\":\"Existing Policies\"},on:{\"input\":function($event){_vm.changeRoute()}},model:{value:(_vm.selectedPolicy),callback:function ($$v) {_vm.selectedPolicy=$$v},expression:\"selectedPolicy\"}})],1)],1):_vm._e(),(_vm.params.network.length > 0)?_c('div',[_c('v-divider'),_c('v-subheader',[_vm._v(\"Network parameters\")]),(!_vm.existingNetworks)?_c('v-card-text',[_vm._l((_vm.params.network),function(param){return _c('div',{key:param.name},[_c('v-text-field',{attrs:{\"label\":_vm.createLabel(param),\"required\":\"\"},model:{value:(param.value),callback:function ($$v) {_vm.$set(param, \"value\", $$v)},expression:\"param.value\"}})],1)}),_c('v-btn',{attrs:{\"color\":\"primary\"},on:{\"click\":_vm.getExistingNetworks}},[_vm._v(\"Or Select existing network\")])],2):_c('v-card-text',[_c('v-select',{attrs:{\"items\":_vm.existingNetworks,\"label\":\"Existing Networks\"},model:{value:(_vm.selectedNetwork),callback:function ($$v) {_vm.selectedNetwork=$$v},expression:\"selectedNetwork\"}}),_c('v-btn',{attrs:{\"color\":\"primary\"},on:{\"click\":function($event){_vm.existingNetworks=null}}},[_vm._v(\"Or Select new network\")])],1)],1):_vm._e(),_c('v-divider'),_c('v-subheader',[_vm._v(\"Map containers to parameter sets\")]),_c('v-card-text',_vm._l((_vm.instanceParamSets),function(value,key){return _c('v-text-field',{key:key,attrs:{\"label\":_vm.createReplicasLabel(key),\"required\":\"\"},model:{value:(_vm.instanceParamSets[key]),callback:function ($$v) {_vm.$set(_vm.instanceParamSets, key, $$v)},expression:\"instanceParamSets[key]\"}})}),1),_c('v-card-actions',[_c('v-layout',{attrs:{\"row\":\"\",\"justify-center\":\"\"}},[_c('v-dialog',{staticClass:\"mx-1\",attrs:{\"persistent\":\"\",\"max-width\":\"600px\"},model:{value:(_vm.permissions_error_dialog),callback:function ($$v) {_vm.permissions_error_dialog=$$v},expression:\"permissions_error_dialog\"}},[_c('v-btn',{attrs:{\"slot\":\"activator\",\"color\":\"primary\",\"dark\":\"\"},slot:\"activator\"},[_vm._v(\"Create Cluster\")]),_c('v-card',[_c('v-card-title',[_c('span',{staticClass:\"headline\"},[_vm._v(\"Terraform user credentials\")])]),_c('v-card-text',[_c('v-container',{attrs:{\"grid-list-md\":\"\"}},[_c('v-layout',{attrs:{\"wrap\":\"\"}},_vm._l((_vm.csp.requiredCredentials),function(credential){return _c('v-flex',{key:credential,attrs:{\"xs12\":\"\"}},[_c('v-text-field',{attrs:{\"label\":credential},model:{value:(_vm.credentialParameters[credential]),callback:function ($$v) {_vm.$set(_vm.credentialParameters, credential, $$v)},expression:\"credentialParameters[credential]\"}})],1)}),1)],1)],1),_c('v-card-actions',[_c('v-spacer'),_c('v-btn',{attrs:{\"color\":\"blue darken-1\",\"flat\":\"\"},on:{\"click\":function($event){_vm.permissions_error_dialog = false}}},[_vm._v(\"Cancel\")]),_c('v-btn',{attrs:{\"color\":\"blue darken-1\",\"flat\":\"\"},on:{\"click\":_vm.validateCredentials}},[_vm._v(\"OK\")])],1)],1)],1),_c('v-btn',{attrs:{\"color\":\"secondary\"},on:{\"click\":function($event){_vm.deployCluster(true)}}},[_vm._v(\"Download Terraform Templates\")])],1)],1)],1),(_vm.clusterCreated)?_c('div',[_c('h3',[_vm._v(\"Cluster created\")]),_vm._v(\"\\n Great job! The cluster is created. Terraform has created the following resources:\\n \"),_c('br'),_c('div',[_c('pre',[_vm._v(_vm._s(_vm._f(\"pretty\")(_vm.terraformResult)))])])]):_vm._e()],1),_c('v-dialog',{attrs:{\"persistent\":\"\",\"max-width\":\"600\"},model:{value:(_vm.policyValidationErrorDialog),callback:function ($$v) {_vm.policyValidationErrorDialog=$$v},expression:\"policyValidationErrorDialog\"}},[_c('v-card',[_c('v-card-title',{staticClass:\"headline\"},[_vm._v(\"Policy '\"+_vm._s(_vm.selectedPolicy)+\"' does not have the required permissions\\n \")]),_c('v-card-text',[_vm._v(\"Please select another policy or add to '\"+_vm._s(_vm.selectedPolicy)+\"' the following permissions:\\n \")]),_c('v-list',{attrs:{\"dense\":\"\"}},_vm._l((_vm.policyValidationError),function(permission){return _c('v-list-tile',{key:permission},[_c('v-list-tile-content',[_c('v-list-tile-title',{domProps:{\"textContent\":_vm._s(permission)}})],1)],1)}),1),_c('v-card-actions',[_c('v-spacer'),_c('v-btn',{attrs:{\"color\":\"green darken-1\",\"flat\":\"\"},on:{\"click\":function($event){_vm.policyValidationErrorDialog = false}}},[_vm._v(\"Close\")])],1)],1)],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\n <v-container v-if=\"params\" grid-list-md>\n <v-layout row wrap>\n\n <v-card class=\"text-md-center ma-3\">\n <v-card-title primary-title>\n <div>\n <h3 class=\"headline mb-0\">\n Please review cluster parameter values\n </h3>\n </div>\n </v-card-title>\n\n <v-divider></v-divider>\n <v-subheader>Cluster master parameters</v-subheader>\n <v-card-text>\n <div v-for=\"param in params.master\" :key=\"param.name\">\n <v-select v-if=\"param.range\"\n v-model=\"param.value\"\n :items=\"param.range\"\n :label=\"createLabel(param)\">\n </v-select>\n\n <v-text-field v-else\n v-model=\"param.value\"\n :label=\"createLabel(param)\"\n required>\n </v-text-field>\n </div>\n </v-card-text>\n\n <v-divider></v-divider>\n <v-subheader>Cluster nodes parameters</v-subheader>\n <v-card-text>\n <div v-for=\"param in params.nodes\" :key=\"param.name\">\n <v-select v-if=\"param.range\"\n v-model=\"param.value\"\n :items=\"param.range\"\n :label=\"createLabel(param)\">\n </v-select>\n\n <v-text-field v-else\n v-model=\"param.value\"\n :label=\"createLabel(param)\"\n required>\n </v-text-field>\n </div>\n </v-card-text>\n\n <div v-if=\"policies\">\n <v-divider></v-divider>\n <v-subheader>Policy to attach to cluster and worker nodes</v-subheader>\n <v-card-text>\n <v-select v-model=\"selectedPolicy\"\n :items=\"policies\"\n label=\"Existing Policies\"\n v-on:input=\"changeRoute()\">\n </v-select>\n </v-card-text>\n </div>\n\n\n <div v-if=\"params.network.length > 0\">\n <v-divider></v-divider>\n <v-subheader>Network parameters</v-subheader>\n <v-card-text v-if=\"!existingNetworks\">\n <div v-for=\"param in params.network\" :key=\"param.name\">\n <v-text-field\n v-model=\"param.value\"\n :label=\"createLabel(param)\"\n required>\n </v-text-field>\n </div>\n <v-btn @click=\"getExistingNetworks\" color=\"primary\">Or Select existing network</v-btn>\n </v-card-text>\n <v-card-text v-else>\n <v-select v-model=\"selectedNetwork\"\n :items=\"existingNetworks\"\n label=\"Existing Networks\">\n </v-select>\n <v-btn @click=\"existingNetworks=null\" color=\"primary\">Or Select new network</v-btn>\n </v-card-text>\n </div>\n\n <v-divider></v-divider>\n <v-subheader>Map containers to parameter sets</v-subheader>\n <v-card-text>\n <v-text-field v-for=\"(value, key) in instanceParamSets\"\n v-model=\"instanceParamSets[key]\"\n :label=\"createReplicasLabel(key)\"\n :key=\"key\"\n required>\n </v-text-field>\n </v-card-text>\n\n <v-card-actions>\n <v-layout row justify-center>\n <v-dialog v-model=\"permissions_error_dialog\" persistent max-width=\"600px\" class=\"mx-1\">\n <v-btn slot=\"activator\" color=\"primary\" dark>Create Cluster</v-btn>\n <v-card>\n <v-card-title>\n <span class=\"headline\">Terraform user credentials</span>\n </v-card-title>\n <v-card-text>\n <v-container grid-list-md>\n <v-layout wrap>\n\n <v-flex xs12 v-for=\"credential in csp.requiredCredentials\"\n :key=\"credential\">\n <v-text-field v-model=\"credentialParameters[credential]\"\n :label=\"credential\"></v-text-field>\n </v-flex>\n </v-layout>\n </v-container>\n </v-card-text>\n <v-card-actions>\n <v-spacer></v-spacer>\n <v-btn color=\"blue darken-1\" flat @click=\"permissions_error_dialog = false\">Cancel</v-btn>\n <v-btn color=\"blue darken-1\" flat @click=\"validateCredentials\">OK</v-btn>\n </v-card-actions>\n\n </v-card>\n </v-dialog>\n <v-btn @click=\"deployCluster(true)\" color=\"secondary\">Download Terraform Templates</v-btn>\n </v-layout>\n </v-card-actions>\n </v-card>\n\n <div v-if=\"clusterCreated\">\n <h3>Cluster created</h3>\n Great job! The cluster is created. Terraform has created the following resources:\n <br/>\n\n <div>\n <pre>{{ terraformResult | pretty }}</pre>\n </div>\n </div>\n </v-layout>\n\n <v-dialog v-model=\"policyValidationErrorDialog\" persistent max-width=\"600\">\n <v-card>\n <v-card-title class=\"headline\">Policy '{{selectedPolicy}}' does not have the required permissions\n </v-card-title>\n <v-card-text>Please select another policy or add to '{{selectedPolicy}}' the following permissions:\n </v-card-text>\n <v-list dense>\n <v-list-tile\n v-for=\"permission in policyValidationError\"\n :key=\"permission\">\n\n <v-list-tile-content>\n <v-list-tile-title v-text=\"permission\"></v-list-tile-title>\n </v-list-tile-content>\n\n </v-list-tile>\n </v-list>\n <v-card-actions>\n <v-spacer></v-spacer>\n <v-btn color=\"green darken-1\" flat @click=\"policyValidationErrorDialog = false\">Close</v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n\n </v-container>\n\n</template>\n\n<script>\n export default {\n data() {\n return {\n csp: this.$route.params.csp,\n paramSets: this.$route.params.paramSets,\n valid: true,\n clusterCreated: false,\n terraformResult: null,\n permissions_error_dialog: false,\n existingNetworks: null,\n selectedNetwork: null,\n policies: null,\n selectedPolicy: null,\n policyValidationErrorDialog: false,\n policyValidationError: [],\n credentialParameters: {},\n params: null,\n instanceParamSets: {}\n }\n },\n methods: {\n createLabel(param) {\n return param.name + ' (' + param.description + ')';\n },\n createReplicasLabel(paramSetName) {\n return 'Number of containers using ' + paramSetName;\n },\n getExistingNetworks() {\n this.$http.get('networks/' + this.csp.name)\n .then(response => {\n console.log(response);\n this.existingNetworks = response.data;\n }, response => {\n console.log(response);\n alert(response.data);\n });\n },\n validateCredentials() {\n this.credentialParameters['region'] = this.csp.region;\n const payload = {\n csp: this.csp.name,\n parameters: this.credentialParameters\n };\n console.log(payload);\n this.$http.post('credentials', payload)\n .then(response => {\n console.log(response);\n this.permissions_error_dialog = false;\n this.deployCluster(false);\n }, response => {\n console.log(response);\n alert(response.data);\n });\n },\n changeRoute() {\n console.log(this.selectedPolicy);\n const payload = {\n csp: this.csp.name,\n parameters: {\n policy: this.selectedPolicy\n }\n };\n this.$http.post('policy/validate', payload)\n .then(response => {\n console.log(response.data);\n if (response.data.notAllowedActions.length > 0) {\n this.policyValidationErrorDialog = true;\n this.policyValidationError = response.data.notAllowedActions;\n }\n }, response => {\n alert(response.data);\n });\n },\n deployCluster(downloadFormsOnly) {\n const parameters = {};\n for (let key in this.params.master) {\n let param = this.params.master[key];\n parameters[param.name] = param.value;\n }\n\n for (let key in this.params.nodes) {\n let param = this.params.nodes[key];\n parameters[param.name] = param.value;\n }\n\n if (this.selectedNetwork) {\n parameters['existing-network-name'] = this.selectedNetwork;\n } else {\n for (let key in this.params.network) {\n let param = this.params.network[key];\n parameters[param.name] = param.value;\n }\n }\n\n let containersPerParamSet = Object.keys(this.instanceParamSets)\n .map(k => k + ':' + this.instanceParamSets[k])\n .join(\",\");\n parameters['containersPerParamSet'] = containersPerParamSet;\n\n if (this.selectedPolicy) {\n parameters['jemo-policy-name'] = this.selectedPolicy;\n }\n\n this.$router.push({\n name: 'create-cluster',\n params: {csp: this.csp, parameters: parameters, downloadFormsOnly: downloadFormsOnly}\n })\n },\n init() {\n this.$http.get('cluster/params/' + this.csp.name)\n .then(response => {\n console.log(response);\n this.params = response.data;\n\n let workstationExternalCidr = this.params.master.find(param => param.name === 'workstation-external-cidr');\n if (workstationExternalCidr) {\n this.$http.get('https://ipv4.icanhazip.com')\n .then(response => {\n console.log(response);\n workstationExternalCidr.value = response.data.trim() + '/32';\n }, response => {\n console.log(\"Can not find local ip\");\n console.log(response);\n });\n }\n }, response => {\n console.log(response);\n });\n\n this.$http.get('policy/' + this.csp.name)\n .then(response => {\n console.log(response);\n this.policies = response.data;\n if (this.policies && this.policies.includes('jemo-policy')) {\n this.selectedPolicy = 'jemo-policy';\n }\n }, response => {\n console.log(response);\n });\n\n this.paramSets.forEach(paramSet => this.instanceParamSets[paramSet.name] = 0);\n }\n },\n created() {\n this.init();\n },\n watch: {\n '$route'(to) {\n if (to.name === 'prod-conf') {\n this.csp = to.params.csp ? to.params.csp : this.csp;\n this.paramSets = to.params.paramSets ? to.params.paramSets : this.paramSets;\n\n if (to.params.csp.name !== this.csp.name) {\n this.init();\n } else {\n this.paramSets.forEach(paramSet => this.instanceParamSets[paramSet.name] = 0);\n }\n }\n }\n },\n }\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/vuetify-loader/lib/loader.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ProdConf.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/vuetify-loader/lib/loader.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ProdConf.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ProdConf.vue?vue&type=template&id=36ee7c7c&\"\nimport script from \"./ProdConf.vue?vue&type=script&lang=js&\"\nexport * from \"./ProdConf.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"ProdConf.vue\"\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib'\nimport { VCard } from 'vuetify/lib'\nimport { VCardActions } from 'vuetify/lib'\nimport { VCardText } from 'vuetify/lib'\nimport { VCardTitle } from 'vuetify/lib'\nimport { VContainer } from 'vuetify/lib'\nimport { VDialog } from 'vuetify/lib'\nimport { VDivider } from 'vuetify/lib'\nimport { VFlex } from 'vuetify/lib'\nimport { VLayout } from 'vuetify/lib'\nimport { VList } from 'vuetify/lib'\nimport { VListTile } from 'vuetify/lib'\nimport { VListTileContent } from 'vuetify/lib'\nimport { VListTileTitle } from 'vuetify/lib'\nimport { VSelect } from 'vuetify/lib'\nimport { VSpacer } from 'vuetify/lib'\nimport { VSubheader } from 'vuetify/lib'\nimport { VTextField } from 'vuetify/lib'\ninstallComponents(component, {\n VBtn,\n VCard,\n VCardActions,\n VCardText,\n VCardTitle,\n VContainer,\n VDialog,\n VDivider,\n VFlex,\n VLayout,\n VList,\n VListTile,\n VListTileContent,\n VListTileTitle,\n VSelect,\n VSpacer,\n VSubheader,\n VTextField,\n})\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/core/src/test/java/org/eclipse/jemo/JemoBaseTest.java b/core/src/test/java/org/eclipse/jemo/JemoBaseTest.java
index cd2706a..3a25b83 100644
--- a/core/src/test/java/org/eclipse/jemo/JemoBaseTest.java
+++ b/core/src/test/java/org/eclipse/jemo/JemoBaseTest.java
@@ -33,6 +33,8 @@
import org.junit.AfterClass;
import static org.eclipse.jemo.api.JemoParameter.*;
+import static org.eclipse.jemo.internal.model.AmazonAWSRuntime.AWS_REGION_PROP;
+import static org.eclipse.jemo.internal.model.GCPRuntime.GCP_REGION_PROP;
/**
*
@@ -56,7 +58,8 @@
protected TestJemoServer jemoServer = null;
protected JemoBaseTest(boolean serverInstance) {
- System.setProperty(REGION.label(),"eu-west-1");
+ System.setProperty(AWS_REGION_PROP,"eu-west-1");
+ System.setProperty(GCP_REGION_PROP,"europe-west2-a");
System.setProperty(LOG_LOCAL.label(),"true");
System.setProperty(CLOUD.label(),"MEMORY");
System.setProperty("eclipse.jemo.azure.msg.model","QUEUE");
diff --git a/core/src/test/java/org/eclipse/jemo/TestCloudRuntime.java b/core/src/test/java/org/eclipse/jemo/TestCloudRuntime.java
index 0f5d1f3..9d39469 100644
--- a/core/src/test/java/org/eclipse/jemo/TestCloudRuntime.java
+++ b/core/src/test/java/org/eclipse/jemo/TestCloudRuntime.java
@@ -18,7 +18,6 @@
import org.eclipse.jemo.internal.model.*;
import org.eclipse.jemo.internal.model.JemoMessage;
-import org.eclipse.jemo.sys.JemoPluginManager;
import org.eclipse.jemo.sys.auth.JemoUser;
import org.eclipse.jemo.sys.internal.Util;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -408,7 +407,7 @@
try {
runtime.pollQueue(QUEUE_ID + "_fake", (msg1) -> {
});
- assertFalse(runtime.getClass().getSimpleName(), true);
+ fail(runtime.getClass().getSimpleName());
} catch (QueueDoesNotExistException ex) {
assertNotNull(runtime.getClass().getSimpleName(), ex);
}
diff --git a/runtime-impl/azure-runtime/pom.xml b/runtime-impl/azure-runtime/pom.xml
index a206fa6..8716d4f 100644
--- a/runtime-impl/azure-runtime/pom.xml
+++ b/runtime-impl/azure-runtime/pom.xml
@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.jemo</groupId>
<artifactId>azure-runtime</artifactId>
- <version>1.0</version>
+ <version>1.0.1</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -16,7 +16,7 @@
<dependency>
<groupId>org.eclipse.jemo</groupId>
<artifactId>jemo</artifactId>
- <version>1.0.2</version>
+ <version>1.0.3</version>
<scope>provided</scope>
</dependency>
diff --git a/runtime-impl/azure-runtime/src/main/java/org/eclipse/jemo/runtime/azure/MicrosoftAzureRuntime.java b/runtime-impl/azure-runtime/src/main/java/org/eclipse/jemo/runtime/azure/MicrosoftAzureRuntime.java
index ba82577..491c797 100644
--- a/runtime-impl/azure-runtime/src/main/java/org/eclipse/jemo/runtime/azure/MicrosoftAzureRuntime.java
+++ b/runtime-impl/azure-runtime/src/main/java/org/eclipse/jemo/runtime/azure/MicrosoftAzureRuntime.java
@@ -104,14 +104,12 @@
import io.kubernetes.client.util.Config;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.HmacUtils;
-import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.fluent.Form;
import org.apache.http.client.fluent.Request;
import org.apache.http.client.fluent.Response;
import org.apache.http.entity.ContentType;
-import org.jetbrains.annotations.NotNull;
/**
* TODO: we need to bring the test coverage on the Azure Runtime to 100% right now there are no tests and this is bad.
@@ -188,15 +186,6 @@
MSG_MODEL = MESSAGE_MODEL.valueOf(readProperty(PROP_MSG_MODEL, properties, QUEUE.name()));
}
- private static String readProperty(String propertyName, Properties properties, String defaultValue) {
- final String value = readParameterFromJvmOrEnv(propertyName);
- if (value != null) {
- return value;
- }
-
- return properties == null || properties.getProperty(propertyName) == null ? defaultValue : properties.getProperty(propertyName);
- }
-
static class AzureCredentials {
private final String tenantId, clientId, clientSecret;
@@ -327,7 +316,6 @@
});
}
- @NotNull
private HttpResponse sendRequest(HttpMode httpMode, String uri, String requestBody) {
return Util.F(null, x -> {
final String authToken = getAuthToken();
@@ -345,7 +333,6 @@
});
}
- @NotNull
private Request createRequest(HttpMode httpMode, String uri) {
switch (httpMode) {
case GET:
@@ -1607,7 +1594,6 @@
*
* @return
*/
- @NotNull
private String getLogWorkSpaceLocationBasedOnRegion(String region) {
return AKS_REGION_TO_LOG_WORKSPACE_REGION.getOrDefault(region, "uksouth");
}
@@ -1786,7 +1772,6 @@
storePropertiesFile(propertiesFromFile);
}
- @NotNull
private Path prepareTerraformFiles(SetupParams setupParams) throws IOException {
final String terraformDir = getTerraformClusterDir();
final Path terraformDirPath = Paths.get(terraformDir);
@@ -1835,4 +1820,11 @@
delete(getDefaultCategory(), pluginJarFileName + ".classlist.moduledata");
delete(getDefaultCategory(), pluginJarFileName + ".crc32.moduledata");
}
+
+ @Override
+ public String isCliInstalled() {
+ final boolean isInstalled = isCommandInstalled("az --help");
+ return isInstalled ? null : "Please install 'az'. Instructions on https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest";
+ }
+
}
diff --git a/runtime-impl/azure-runtime/src/main/resources/azure/cluster/kubernetes/jemo-statefulset.yaml b/runtime-impl/azure-runtime/src/main/resources/azure/cluster/kubernetes/jemo-statefulset.yaml
index 943765f..a00df6b 100644
--- a/runtime-impl/azure-runtime/src/main/resources/azure/cluster/kubernetes/jemo-statefulset.yaml
+++ b/runtime-impl/azure-runtime/src/main/resources/azure/cluster/kubernetes/jemo-statefulset.yaml
@@ -18,7 +18,7 @@
spec:
containers:
- name: jemo
- image: eclipse/jemo:1.0.2
+ image: eclipse/jemo:1.0.3
env:
- name: eclipse.jemo.cloud
value: "AZURE"