Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
25 changes: 25 additions & 0 deletions api/v1/ansibleplaybook_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,40 @@ type AnsiblePlaybookSpec struct {
// +optional
Vars map[string]IntOrStringOrYamlStore `json:"vars,omitempty"`

ProxyVars []AnsiblePlaybookProxyVar `json:"proxyVars,omitempty"`

ResourceSpecBase `json:",inline"`
}

type AnsiblePlaybookProxyVar struct {
Name string `json:"name,omitempty"`
Service string `json:"service,omitempty"`
}

// AnsiblePlaybookStatus defines the observed state of AnsiblePlaybook
type AnsiblePlaybookStatus struct {
// Important: Run "make" to regenerate code after modifying this file
ResourceStatusBase `json:",inline"`
// +optional
ExternalInfo AnsiblePlaybookInfo `json:"externalInfo,omitempty"`

DevtoolSshInfos []DevtoolSshInfo `json:"devtoolSshInfos,omitempty"`
ServiceUrls []DevtoolServiceUrl `json:"serviceUrls,omitempty"`
}

type DevtoolSshInfo struct {
VMName string `json:"vmName,omitempty"`
Id string `json:"id,omitempty"`
User string `json:"user,omitempty"`
Host string `json:"host,omitempty"`
Port int `json:"port,omitempty"`
ServerName string `json:"serverName,omitempty"`
}

type DevtoolServiceUrl struct {
Id string `json:"id,omitempty"`
Service string `json:"service,omitempty"`
Url string `json:"url,omitempty"`
}

type AnsiblePlaybookHost struct {
Expand Down
62 changes: 61 additions & 1 deletion api/v1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

37 changes: 37 additions & 0 deletions config/crd/bases/onecloud.yunion.io_ansibleplaybooks.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,15 @@ spec:
name:
type: string
type: object
proxyVars:
items:
properties:
name:
type: string
service:
type: string
type: object
type: array
vars:
additionalProperties:
properties:
Expand Down Expand Up @@ -191,6 +200,23 @@ spec:
status:
description: AnsiblePlaybookStatus defines the observed state of AnsiblePlaybook
properties:
devtoolSshInfos:
items:
properties:
host:
type: string
id:
type: string
port:
type: integer
serverName:
type: string
user:
type: string
vmName:
type: string
type: object
type: array
externalInfo:
properties:
action:
Expand All @@ -211,6 +237,17 @@ spec:
description: A human readable message indicating details about why resource
is in this phase.
type: string
serviceUrls:
items:
properties:
id:
type: string
service:
type: string
url:
type: string
type: object
type: array
tryTimes:
description: TryTimes record the continuous try times.
format: int32
Expand Down
130 changes: 125 additions & 5 deletions controllers/ansibleplaybook_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,14 @@ func (r *AnsiblePlaybookReconciler) Reconcile(req ctrl.Request) (ctrl.Result, er
}

if ansiblePlaybook.Status.Phase == onecloudv1.ResourceFinished {
for _, info := range ansiblePlaybook.Status.DevtoolSshInfos {
resources.DeleteSshInfo(ctx, info.Id)
}
ansiblePlaybook.Status.DevtoolSshInfos = []onecloudv1.DevtoolSshInfo{}
for _, url := range ansiblePlaybook.Status.ServiceUrls {
resources.DeleteServiceUrl(ctx, url.Id)
}
ansiblePlaybook.Status.ServiceUrls = []onecloudv1.DevtoolServiceUrl{}
if ansiblePlaybook.Status.ExternalInfo.Id == "" {
return ctrl.Result{}, nil
}
Expand Down Expand Up @@ -186,14 +194,126 @@ func (r *AnsiblePlaybookReconciler) Reconcile(req ctrl.Request) (ctrl.Result, er
)
return ctrl.Result{}, r.Status().Update(ctx, &ansiblePlaybook)
}
hosts = append(hosts, resources.AnsiblePlaybookHost{
VM: &vm,
Vars: vars,
})
// prepare sshinfo
var sshInfo *onecloudv1.DevtoolSshInfo
for i := range ansiblePlaybook.Status.DevtoolSshInfos {
info := &ansiblePlaybook.Status.DevtoolSshInfos[i]
if info.VMName == vm.Name {
sshInfo = info
break
}
}
switch {
case sshInfo == nil:
id, err := resources.CreateSshInfo(ctx, vm.Status.ExternalInfo.Id)
if err != nil {
ansiblePlaybook.GetResourceStatus().SetPhase(onecloudv1.ResourceFailed,
fmt.Sprintf("unable to create sshinfo for vm %s: %v", vm.Name, err),
)
return ctrl.Result{}, r.Status().Update(ctx, &ansiblePlaybook)
}
ansiblePlaybook.Status.DevtoolSshInfos = append(ansiblePlaybook.Status.DevtoolSshInfos, onecloudv1.DevtoolSshInfo{VMName: vm.Name, Id: id})
case sshInfo.Host == "":
sshInfoData, err := resources.GetSshInfo(ctx, sshInfo.Id)
if err != nil {
ansiblePlaybook.GetResourceStatus().SetPhase(onecloudv1.ResourceFailed,
fmt.Sprintf("unable to get sshinfo %s: %v", sshInfo.Id, err),
)
return ctrl.Result{}, r.Status().Update(ctx, &ansiblePlaybook)
}
switch sshInfoData.Status {
case "ready":
sshInfo.Host = sshInfoData.Host
sshInfo.Port = sshInfoData.Port
sshInfo.User = sshInfoData.User
sshInfo.ServerName = sshInfoData.ServerName
hosts = append(hosts, resources.AnsiblePlaybookHost{
VM: &vm,
Vars: vars,
SshInfo: sshInfo,
})
case "create_failed":
ansiblePlaybook.GetResourceStatus().SetPhase(onecloudv1.ResourceFailed,
fmt.Sprintf("unable to create sshinfo %s: %s", sshInfo.Id, sshInfoData.FailedReason),
)
return ctrl.Result{}, r.Status().Update(ctx, &ansiblePlaybook)
case "creating":
return r.MarkWaiting(ctx, &ansiblePlaybook, fmt.Sprintf("wait for sshinfo %s created", sshInfo.Id), apWaitingAfter)
}
default:
hosts = append(hosts, resources.AnsiblePlaybookHost{
VM: &vm,
Vars: vars,
SshInfo: sshInfo,
})
}
}
if len(hosts) != len(ansiblePlaybook.Spec.Inventory) {
return r.MarkWaiting(ctx, &ansiblePlaybook, "wait fro sshinfo to create", apWaitingAfter)
}

// build common vars
ansibleInfo := resources.ServerAnsibleInfo{
User: hosts[0].SshInfo.User,
IP: hosts[0].SshInfo.Host,
Port: hosts[0].SshInfo.Port,
Name: hosts[0].SshInfo.ServerName,
}

// preapre Proxy service
commonVars := make(map[string]interface{}, len(ansiblePlaybook.Spec.Vars))
for _, pv := range ansiblePlaybook.Spec.ProxyVars {
var sUrl *onecloudv1.DevtoolServiceUrl
for i := range ansiblePlaybook.Status.ServiceUrls {
url := &ansiblePlaybook.Status.ServiceUrls[i]
if url.Service == pv.Service {
sUrl = url
break
}
}
switch {
case sUrl == nil:
id, err := resources.CreateServiceUrl(ctx, resources.ServiceUrlCreateParam{
ServerId: hosts[0].VM.Status.ExternalInfo.Id,
Service: pv.Service,
ServerAnsibleInfo: ansibleInfo,
})
if err != nil {
ansiblePlaybook.GetResourceStatus().SetPhase(onecloudv1.ResourceFailed,
fmt.Sprintf("unable to create serviceurl for service %s: %v", pv.Service, err),
)
return ctrl.Result{}, r.Status().Update(ctx, &ansiblePlaybook)
}
ansiblePlaybook.Status.ServiceUrls = append(ansiblePlaybook.Status.ServiceUrls, onecloudv1.DevtoolServiceUrl{Id: id, Service: pv.Service})
case sUrl.Url == "":
uData, err := resources.GetServiceUrl(ctx, sUrl.Id)
if err != nil {
ansiblePlaybook.GetResourceStatus().SetPhase(onecloudv1.ResourceFailed,
fmt.Sprintf("unable to get serviceurl for service %s: %v", pv.Service, err),
)
return ctrl.Result{}, r.Status().Update(ctx, &ansiblePlaybook)
}
switch uData.Status {
case "ready":
sUrl.Url = uData.Url
commonVars[pv.Name] = sUrl.Url
case "creating":
return r.MarkWaiting(ctx, &ansiblePlaybook, fmt.Sprintf("wait for serviceurl %s created", sUrl.Id), apWaitingAfter)
case "create_failed":
ansiblePlaybook.GetResourceStatus().SetPhase(onecloudv1.ResourceFailed,
fmt.Sprintf("unable to create sshinfo %s: %s", uData.Id, uData.FailedReason),
)
return ctrl.Result{}, r.Status().Update(ctx, &ansiblePlaybook)
}
default:
commonVars[pv.Name] = sUrl.Url
}
}

if len(commonVars) != len(ansiblePlaybook.Spec.ProxyVars) {
return r.MarkWaiting(ctx, &ansiblePlaybook, "wait fro serviceUrl to create", apWaitingAfter)
}

// build common vars
for varName, sv := range ansiblePlaybook.Spec.Vars {
vv, err := sv.GetValue(ctx)
if err != nil {
Expand Down
12 changes: 6 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ require (
github.com/mcuadros/go-lookup v0.0.0-20200330054200-b4062b0c4c85
github.com/onsi/ginkgo v1.11.0
github.com/onsi/gomega v1.8.1
k8s.io/apiextensions-apiserver v0.17.2
k8s.io/apimachinery v0.17.3
gopkg.in/inf.v0 v0.9.1 // indirect
k8s.io/apimachinery v0.19.3
k8s.io/client-go v9.0.0+incompatible
sigs.k8s.io/controller-runtime v0.5.0
yunion.io/x/jsonutils v0.0.0-20200415132054-2bf8a5e94501
yunion.io/x/onecloud v0.0.0-20200427025506-7f96ad48447f
yunion.io/x/pkg v0.0.0-20200416145704-22c189971435
yunion.io/x/structarg v0.0.0-20200423163001-168d0687be7e
yunion.io/x/jsonutils v0.0.0-20210709075951-798a67800349
yunion.io/x/onecloud v0.0.0-20210905085923-e7ef470652cd
yunion.io/x/pkg v0.0.0-20210721081124-55078288ca4c
yunion.io/x/structarg v0.0.0-20200720093445-9f850fa222ce
)

replace (
Expand Down
Loading