A multi-instance StackPack requires a provisioning script that is able to provision multiple StackPack instances. To achieve that, you need to provide a separate template file in the context for both stackPack
and instance
; stackPack
needs to be provided with the shared-template.stj
, and instance
requires the instance-template.stj
as in the example below:
Please note that instance-template.stj
has some instance specific information, like topicName
, instanceId
and anything else defined in templateArguments
, while shared-template
passes without any specifics ([:]
).
import com.stackstate.stackpack.ProvisioningScriptimport com.stackstate.stackpack.ProvisioningContextimport com.stackstate.stackpack.ProvisioningIOimport com.stackstate.stackpack.Version​class Provision extends ProvisioningScript {​Provision(ProvisioningContext context) {super(context)}​@OverrideProvisioningIO<scala.Unit> install(Map<String, Object> config) {def instance_url = instanceURL(config)def templateArguments = ['topicName': topicName(config),'instance_url': instance_url,'instanceId': context().instance().id()]templateArguments.putAll(config)​return context().stackPack().importSnapshot("templates/shared-template.stj", [:]) >>context().instance().importSnapshot("templates/instance-template.stj", templateArguments)}​@OverrideProvisioningIO<scala.Unit> upgrade(Map<String, Object> config, Version current) {return install(config)}​@Overridevoid waitingForData(Map<String, Object> config) {context().sts().onDataReceived(topicName(config), {context().sts().provisioningComplete()})}​private def topicName(Map<String, Object> exampleConfig) {def instance_url = exampleConfig.test_instance_urldef topic = instance_url.replace("/", "_").replace(":", "_")return context().sts().createTopologyTopicName("example", topic)}​private def instanceURL(Map<String, Object> exampleConfig) {def url = exampleConfig.test_instance_urldef instance_url = ''if (url.startsWith('http') || url.startsWith('https')){instance_url = url.split("//")[1].split("/")[0]}else{instance_url = url.split("/")[0]}return instance_url}​}
The last step is to prepare a StackPack .sts
package and upload it to StackState.​