create.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package tasks
  15. import (
  16. "context"
  17. "time"
  18. "yunion.io/x/jsonutils"
  19. "yunion.io/x/log"
  20. "yunion.io/x/onecloud/pkg/mcclient"
  21. "yunion.io/x/onecloud/pkg/util/ssh"
  22. )
  23. var _ IServerBaseDeployTask = new(SBaremetalServerCreateTask)
  24. type SBaremetalServerCreateTask struct {
  25. SBaremetalServerBaseDeployTask
  26. }
  27. func NewBaremetalServerCreateTask(
  28. userCred mcclient.TokenCredential,
  29. baremetal IBaremetal,
  30. taskId string,
  31. data jsonutils.JSONObject,
  32. ) ITask {
  33. task := &SBaremetalServerCreateTask{
  34. SBaremetalServerBaseDeployTask: newBaremetalServerBaseDeployTask(userCred, baremetal, taskId, data),
  35. }
  36. task.SetVirtualObject(task)
  37. task.SetStage(task.InitPXEBootTask)
  38. return task
  39. }
  40. func (self *SBaremetalServerCreateTask) GetName() string {
  41. return "BaremetalServerCreateTask"
  42. }
  43. func (self *SBaremetalServerCreateTask) RemoveEFIOSEntry() bool {
  44. return true
  45. }
  46. func (self *SBaremetalServerCreateTask) DoDeploys(ctx context.Context, term *ssh.Client) (jsonutils.JSONObject, error) {
  47. if err := self.Baremetal.GetServer().DoEraseDisk(term); err != nil {
  48. return nil, self.onError(ctx, term, err)
  49. }
  50. time.Sleep(2 * time.Second)
  51. // Build raid
  52. tool, err := self.Baremetal.GetServer().DoDiskConfig(term)
  53. if err != nil {
  54. return nil, self.onError(ctx, term, err)
  55. }
  56. time.Sleep(2 * time.Second)
  57. rootDisk, parts, err := self.Baremetal.GetServer().DoPartitionDisk(tool, term, self.IsDisableImageCache())
  58. if err != nil {
  59. return nil, self.onError(ctx, term, err)
  60. }
  61. data := jsonutils.NewDict()
  62. disks, err := self.Baremetal.GetServer().SyncPartitionSize(term, rootDisk, parts)
  63. if err != nil {
  64. return nil, self.onError(ctx, term, err)
  65. }
  66. data.Add(jsonutils.Marshal(disks), "disks")
  67. rootImageId := self.Baremetal.GetServer().GetRootTemplateId()
  68. if len(rootImageId) > 0 {
  69. deployInfo, err := self.Baremetal.GetServer().DoDeploy(tool, term, self.data, true)
  70. if err != nil {
  71. return nil, self.onError(ctx, term, err)
  72. }
  73. if deployInfo != nil {
  74. data.Update(deployInfo)
  75. }
  76. }
  77. return data, nil
  78. }
  79. func doPoweroff(term *ssh.Client) error {
  80. if _, err := term.Run("/sbin/poweroff"); err != nil {
  81. log.Errorf("poweroff error: %s", err)
  82. return nil
  83. }
  84. time.Sleep(2 * time.Second)
  85. return nil
  86. }
  87. func (self *SBaremetalServerCreateTask) PostDeploys(ctx context.Context, term *ssh.Client) error {
  88. if self.Baremetal.HasBMC() {
  89. return doPoweroff(term)
  90. }
  91. return nil
  92. }
  93. func (self *SBaremetalServerCreateTask) onError(ctx context.Context, term *ssh.Client, err error) error {
  94. log.Errorf("Create server error: %+v", err)
  95. if err1 := self.Baremetal.GetServer().DoEraseDisk(term); err1 != nil {
  96. log.Warningf("EraseDisk error: %v", err1)
  97. }
  98. self.Baremetal.AutoSyncStatus(ctx)
  99. return err
  100. }