You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.8 KiB
72 lines
1.8 KiB
package service |
|
|
|
import ( |
|
"context" |
|
|
|
"go-common/app/admin/ep/merlin/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
) |
|
|
|
// GenMachinesV2 create multiple machines for v2. |
|
func (s *Service) GenMachinesV2(c context.Context, gmr *model.GenMachinesRequest, u string) (err error) { |
|
var ( |
|
ins []*model.CreateInstance |
|
cluster *model.Cluster |
|
hasMachine bool |
|
ms []*model.Machine |
|
) |
|
if hasMachine, err = s.dao.HasMachine(gmr.Name); err != nil { |
|
return |
|
} |
|
if hasMachine { |
|
err = ecode.MerlinDuplicateMachineNameErr |
|
return |
|
} |
|
if cluster, err = s.dao.QueryCluster(c, gmr.NetworkID); err != nil { |
|
return |
|
} |
|
if cluster == nil { |
|
err = ecode.MerlinInvalidClusterErr |
|
return |
|
} |
|
if err = cluster.Verify(); err != nil { |
|
return |
|
} |
|
pgmr := gmr.ToPaasGenMachineRequest(s.c.Paas.MachineLimitRatio) |
|
if ms, err = s.dao.InsertMachinesV2(u, gmr, pgmr); err != nil { |
|
return |
|
} |
|
go func() { |
|
var ( |
|
mIDs []int64 |
|
mim map[int64]string |
|
nmm = make(map[string]*model.Machine) |
|
cTODO = context.TODO() |
|
) |
|
for _, m := range ms { |
|
mIDs = append(mIDs, m.ID) |
|
nmm[m.Name] = m |
|
} |
|
if mim, err = s.AddTagToMachine(cTODO, u, gmr.Image, mIDs); err != nil { |
|
if err = s.dao.UpdateStatusForMachines(model.CreateTagFailedMachineInMerlin, mIDs); err != nil { |
|
log.Error("Update the status of machines(%v) err(%v)", mIDs, err) |
|
} |
|
return |
|
} |
|
for i, pm := range pgmr.Machines { |
|
pgmr.Machines[i].Image = mim[nmm[pm.Name].ID] |
|
pgmr.Machines[i].Snapshot = true |
|
pgmr.Machines[i].ForcePullImage = true |
|
} |
|
if ins, err = s.dao.GenPaasMachines(cTODO, pgmr); err != nil { |
|
return |
|
} |
|
for _, in := range ins { |
|
if in.InstanceCreateStatus == model.CreateFailedMachineInPaas { |
|
s.dao.UpdateMachineStatusByName(model.ImmediatelyFailedMachineInMerlin, in.InstanceName) |
|
} |
|
} |
|
}() |
|
return |
|
}
|
|
|