@@startuml

header **Cloud-Barista Ladybug** (v0.4.0-cafemocha)
title Create a cluster
hide footbox

participant	"Webtool"		as webtool		#d1e0ff

participant	"Ladybug"		as provider
database	"Ladybug data"	as db

participant	"Tumblebug"		as tumblebug	#d1e0ff
participant	"Nodes"			as nodes		#eeeeee
participant	"Control plane"	as mNodes		#eeeeee
participant	"Worker nodes"	as wNodes		#eeeeee

skinparam sequence {
	GroupColor DeepSkyBlue
}


activate webtool
	webtool		->	provider		: POST/ns/:ns/clusters/:cluster\n{name, controlPlane:{}, workrer:{}, config:{}}


		activate provider

			'-- 1.infra
			'-- 1.1. namespace
			provider	->	tumblebug	: GET /ns/:ns
			tumblebug	-->	provider	: {namespace}
			provider	->	webtool		: error (if namespace does not exist)

			'-- 1.2. MCIS
			provider	->	tumblebug	: GET /ns/:ns/mcis/:mcis
			tumblebug	-->	provider	: {mcis}
			provider	->	webtool		: [if mics does exist] error 

			'-- 
			provider	->	db			: insert {cluster}

			'-- 1.3. vpc
			provider	->	tumblebug	: GET /ns/:ns/resources/vNet/:vpc
			tumblebug	-->	provider	: {vpc}
			provider	->	tumblebug	: [if it does not exist]\nPOST s/:ns/resources/vNet
			tumblebug	-->	provider	: {vpc}
			provider	->	webtool		: [if there is an error] error

			'-- 1.4. sg(fw)
			provider	->	tumblebug	: GET /ns/:ns/resources/securityGroup/:sg
			tumblebug	-->	provider	: {sg}
			provider	->	tumblebug	: [if it does not exist]\nPOST /ns/:ns/resources/securityGroup
			tumblebug	-->	provider	: {sg}
			provider	->	webtool		: [if there is an error] error

			'-- 1.5. ssh
			provider	->	tumblebug	: GET /ns/:ns/resources/sshKey/:key
			tumblebug	-->	provider	: {keypair}
			provider	->	tumblebug	: [if it does not exist] POST /ns/:ns/resources/sshKey
			tumblebug	-->	provider	: {keypair}
			provider	->	webtool		: [if there is an error] error
			
			'-- 1.6. image
			provider	->	tumblebug	: GET /ns/:ns/resources/image/:image
			tumblebug	-->	provider	: {image}
			provider	->	tumblebug 	: [if it does not exist]\nPOST /ns/:ns/resources/image
			tumblebug	-->	provider	: {image}
			provider	->	webtool		: [if there is an error] error

			'-- 1.7. spec
			provider	->	tumblebug	: GET /ns/:ns/resources/spec/:spec
			tumblebug	-->	provider	: {image}
			provider	->	tumblebug 	: [if it does not exist]\nPOST /ns/:ns/resources/spec
			tumblebug	-->	provider	: {image}
			provider	->	webtool		: [if there is an error] error

			'-- 1.8. mcis (vm)
			provider	->	provider	: append VMs (while node count)
			provider	->	tumblebug	: POST /ns/:ns/mcis/:mcis
			tumblebug	-->	provider	: {mcis}
			provider	->	webtool		: [if there is an error] error

			'--
			provider	->	db						: update {cluster}

			' -- 2.1. boostrap
			loop nodes
				provider	<->o	nodes		: test ssh connection
				provider	<->o	nodes		: copy scripts
				provider	<->o	nodes		: systemd
				provider	<->o	nodes		: bootstrap
				provider	->		webtool		: [if there is an error] error
			end

			' -- 2.2. 
			alt leader of control-plane  nodes
				provider	<->o	mNodes		: haproxy
				provider	<->o	mNodes		: init
				provider	<->o	mNodes		: network CNI
				provider	->	webtool			: [if there is an error] error
			end

			' -- 2.3. 
			alt not leader of control-plane nodes
				provider	<->o	mNodes		: join (not leader of control-plane nodes)
				provider	->	webtool			: [if there is an error] error
			end

			' -- 2.3. 
			alt woker nodes
				provider	<->o	wNodes		: join
				provider	->	webtool			: [if there is an error] error
			end

		deactivate provider

		provider	->	db						: complete {cluster}
		provider	-->	webtool					: {cluster}

deactivate webtool

@@enduml