blob: dc46f68a35de1a4a92a749a1bcf130150a9778ae [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.brooklyn.entity.database;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import javax.annotation.Nullable;
import com.google.common.collect.ImmutableMap;
import org.apache.brooklyn.api.catalog.CatalogConfig;
import org.apache.brooklyn.api.effector.Effector;
import org.apache.brooklyn.api.entity.Entity;
import org.apache.brooklyn.api.sensor.AttributeSensor;
import org.apache.brooklyn.config.ConfigKey;
import org.apache.brooklyn.core.config.ConfigKeys;
import org.apache.brooklyn.core.effector.Effectors;
import org.apache.brooklyn.core.entity.EntityInternal;
import org.apache.brooklyn.core.sensor.Sensors;
import org.apache.brooklyn.util.core.ResourceUtils;
import org.apache.brooklyn.util.core.flags.SetFromFlag;
import org.apache.brooklyn.util.core.text.TemplateProcessor;
import org.apache.brooklyn.util.exceptions.Exceptions;
import org.apache.brooklyn.util.stream.KnownSizeInputStream;
import org.apache.brooklyn.util.text.Strings;
public class DatastoreMixins {
private DatastoreMixins() {}
public static final AttributeSensor<String> DATASTORE_URL = HasDatastoreUrl.DATASTORE_URL;
public static interface HasDatastoreUrl {
public static final AttributeSensor<String> DATASTORE_URL = Sensors.newStringSensor("datastore.url",
"Primary contact URL for a datastore (e.g. mysql://localhost:3306/)");
}
public static final Effector<String> EXECUTE_SCRIPT = CanExecuteScript.EXECUTE_SCRIPT;
public static interface CanExecuteScript {
Effector<String> EXECUTE_SCRIPT = Effectors.effector(String.class, "executeScript")
.description("executes the given script contents")
.parameter(ConfigKeys.newStringConfigKey("commands"))
.buildAbstract();
}
public static final ConfigKey<String> CREATION_SCRIPT_CONTENTS = CanGiveCreationScript.CREATION_SCRIPT_CONTENTS;
public static final ConfigKey<String> CREATION_SCRIPT_URL = CanGiveCreationScript.CREATION_SCRIPT_URL;
public static final ConfigKey<String> CREATION_SCRIPT_TEMPLATE = CanGiveCreationScript.CREATION_SCRIPT_TEMPLATE;
public static interface CanGiveCreationScript {
@CatalogConfig(label = "Creation script contents")
@SetFromFlag("creationScriptContents")
public static final ConfigKey<String> CREATION_SCRIPT_CONTENTS = ConfigKeys.newStringConfigKey(
"datastore.creation.script.contents",
"Contents of creation script to initialize the datastore",
"");
@CatalogConfig(label = "Creation script URL")
@SetFromFlag("creationScriptUrl")
public static final ConfigKey<String> CREATION_SCRIPT_URL = ConfigKeys.newStringConfigKey(
"datastore.creation.script.url",
"URL of creation script to use to initialize the datastore (ignored if creationScriptContents is specified)",
"");
@CatalogConfig(label = "Creation script template URL")
@SetFromFlag("creationScriptTemplateUrl")
public static final ConfigKey<String> CREATION_SCRIPT_TEMPLATE = ConfigKeys.newStringConfigKey(
"datastore.creation.script.template.url",
"URL of creation script Freemarker template used to initialize the datastore "
+ "(ignored if datastore.creation.script.contents or datastore.creation.script.url is specified)",
"");
}
/** returns the creation script contents, if it exists, or null if none is defined (error if it cannot be loaded) */
@Nullable public static InputStream getDatabaseCreationScript(Entity entity) {
String url = entity.getConfig(DatastoreMixins.CREATION_SCRIPT_URL);
if (!Strings.isBlank(url))
return new ResourceUtils(entity).getResourceFromUrl(url);
String templateUrl = entity.getConfig(DatastoreMixins.CREATION_SCRIPT_TEMPLATE);
if (!Strings.isBlank(templateUrl)) {
String template = TemplateProcessor.processTemplateContents(new ResourceUtils(entity).getResourceAsString(templateUrl), (EntityInternal) entity, ImmutableMap.<String, Object>of());
try {
return new ByteArrayInputStream(template.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
throw Exceptions.propagate(e);
}
}
String contents = entity.getConfig(DatastoreMixins.CREATION_SCRIPT_CONTENTS);
if (!Strings.isBlank(contents))
return KnownSizeInputStream.of(contents);
return null;
}
/** returns the creation script contents, if it exists, or null if none is defined (error if it cannot be loaded) */
@Nullable public static String getDatabaseCreationScriptAsString(Entity entity) {
String url = entity.getConfig(DatastoreMixins.CREATION_SCRIPT_URL);
if (!Strings.isBlank(url))
return new ResourceUtils(entity).getResourceAsString(url);
String templateUrl = entity.getConfig(DatastoreMixins.CREATION_SCRIPT_TEMPLATE);
if (!Strings.isBlank(templateUrl))
return TemplateProcessor.processTemplateContents(new ResourceUtils(entity).getResourceAsString(templateUrl), (EntityInternal) entity, ImmutableMap.<String, Object>of());
String contents = entity.getConfig(DatastoreMixins.CREATION_SCRIPT_CONTENTS);
if (!Strings.isBlank(contents))
return contents;
return null;
}
/** An entity with the most common datastore config, sensors, and effectors */
public interface DatastoreCommon extends Entity, DatastoreMixins.HasDatastoreUrl, DatastoreMixins.CanExecuteScript, DatastoreMixins.CanGiveCreationScript {
}
}