/
schedule_spmigration.go
133 lines (121 loc) · 5.35 KB
/
schedule_spmigration.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package spmigration
import (
"fmt"
"log"
"time"
"github.com/bjin01/jobmonitor/auth"
"github.com/bjin01/jobmonitor/request"
gorillaxml "github.com/divan/gorilla-xmlrpc/xml"
)
type ScheduleSPMigrationDryRun_Request struct {
Sessionkey string `xmlrpc:"sessionKey"`
Sid int `xmlrpc:"sid"`
TargetIdent string `xmlrpc:"targetIdent"`
BaseChannelLabel string `xmlrpc:"baseChannelLabel"`
OptionalChildChannels []string `xmlrpc:"optionalChildChannels"`
DryRun bool `xmlrpc:"dryRun"`
AllowVendorChange bool `xmlrpc:"allowVendorChange"`
RemoveProductsWithNoSuccessorAfterMigration bool `xmlrpc:"removeProductsWithNoSuccessorAfterMigration"`
EarliestOccurrence time.Time `xmlrpc:"earliestOccurrence"`
}
type ScheduleSPMigrationDryRun_Response struct {
JobID int `xmlrpc:"id"`
}
func (t *Target_Minions) Schedule_Migration(sessionkey *auth.SumaSessionKey,
UserData *Migration_Groups, dryrun bool) {
method := "system.scheduleProductMigration"
for i, minion := range t.Minion_List {
if dryrun == true && minion.Migration_Stage_Status == "Completed" &&
minion.Migration_Stage == "Pkg_Refresh" {
logger.Infof("Minion %s is ready for migration dryrun\n", minion.Minion_Name)
} else if dryrun == false && minion.Migration_Stage_Status == "Completed" &&
minion.Migration_Stage == "Product Migration DryRun" {
logger.Infof("Minion %s is ready for migration\n", minion.Minion_Name)
} else {
continue
}
if minion.Target_Ident == "" {
log.Default().Printf("Target Ident is empty for minion %s\n", minion.Minion_Name)
subject := "Target Ident is empty"
note := fmt.Sprintf("No valid migration target found. %s", minion.Minion_Name)
Add_Note(sessionkey, minion.Minion_ID, subject, note)
continue
}
schedule_spmigration_request := ScheduleSPMigrationDryRun_Request{}
schedule_spmigration_request.Sessionkey = sessionkey.Sessionkey
schedule_spmigration_request.Sid = minion.Minion_ID
schedule_spmigration_request.TargetIdent = minion.Target_Ident
schedule_spmigration_request.BaseChannelLabel = minion.Target_base_channel
schedule_spmigration_request.OptionalChildChannels = minion.Target_Optional_Channels
schedule_spmigration_request.AllowVendorChange = true
schedule_spmigration_request.RemoveProductsWithNoSuccessorAfterMigration = true
schedule_spmigration_request.EarliestOccurrence = time.Now()
/* for _, v := range UserData.Target_Products {
if strings.TrimSpace(v.Product.Base_Channel) == minion.Target_base_channel {
if len(v.Product.OptionalChildChannels) > 0 {
for _, child := range v.Product.OptionalChildChannels {
logger.Infof("%s: Add optional channel to schedule spmigration: %s\n",
minion.Minion_Name, child)
schedule_spmigration_request.OptionalChildChannels =
append(schedule_spmigration_request.OptionalChildChannels, strings.TrimSpace(child))
}
}
}
} */
if dryrun == true {
schedule_spmigration_request.DryRun = true
} else {
logger.Infof("Schedule Product Migration for %s now!\n", minion.Minion_Name)
schedule_spmigration_request.DryRun = false
}
buf, err := gorillaxml.EncodeClientRequest(method, &schedule_spmigration_request)
if err != nil {
logger.Fatalf("Encoding error: %s\n", err)
}
//logger.Infof("client request spmigration buffer: %s\n", fmt.Sprintf(string(buf)))
resp, err := request.MakeRequest(buf)
if err != nil {
logger.Infof("Encoding scheduleProductMigration error: %s\n", err)
}
//logger.Infof("scheduleProductMigration client request spmigration response: %s\n", resp.Body)
defer resp.Body.Close()
reply := new(ScheduleSPMigrationDryRun_Response)
err = gorillaxml.DecodeClientResponse(resp.Body, reply)
if err != nil {
if dryrun == true {
logger.Infof("Decode scheduleProductMigration_DryRun Job response body failed: %s %s\n", err, minion.Minion_Name)
} else {
logger.Infof("Decode scheduleProductMigration Job response body failed: %s %s\n", err, minion.Minion_Name)
}
}
//logger.Infof("scheduleProductMigration_DryRun JobID: %d\n", reply.JobID)
var host_info Host_Job_Info
if dryrun == true {
host_info.SP_Migration_DryRun_Job.JobID = reply.JobID
host_info.SP_Migration_DryRun_Job.JobStatus = "Scheduled"
} else {
host_info.SP_Migration_Job.JobID = reply.JobID
host_info.SP_Migration_Job.JobStatus = "Scheduled"
}
if reply.JobID > 0 {
t.Minion_List[i].Host_Job_Info = host_info
if dryrun == true {
t.Minion_List[i].Migration_Stage = "Product Migration DryRun"
logger.Infof("Product migration dryrun JobID: %d %s\n",
t.Minion_List[i].Host_Job_Info.SP_Migration_DryRun_Job.JobID, minion.Minion_Name)
} else {
t.Minion_List[i].Migration_Stage = "Product Migration"
logger.Infof("Product migration JobID: %d %s\n", t.Minion_List[i].Host_Job_Info.SP_Migration_Job.JobID, minion.Minion_Name)
}
t.Minion_List[i].Migration_Stage_Status = "Scheduled"
} else {
if dryrun == true {
logger.Infof("Minion %s product migration dryrun not possible.\n", minion.Minion_Name)
} else {
logger.Infof("Minion %s product migration not possible.\n", minion.Minion_Name)
}
continue
}
}
t.Write_Tracking_file()
}