/
main.go
103 lines (81 loc) · 2.29 KB
/
main.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
// Copyright 2012, 2013 Canonical Ltd.
// Licensed under the AGPLv3, see LICENCE file for details.
package main
import (
"fmt"
"os"
"github.com/juju/cmd"
"github.com/juju/errors"
"github.com/juju/loggo"
"github.com/juju/names"
"launchpad.net/gnuflag"
"github.com/juju/juju/agent"
"github.com/juju/juju/environs"
"github.com/juju/juju/mongo"
"github.com/juju/juju/state"
)
var logger = loggo.GetLogger("juju")
func main() {
ctx, err := cmd.DefaultContext()
if err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(2)
}
os.Exit(cmd.Main(&FixitCommand{}, ctx, os.Args[1:]))
}
type FixitCommand struct {
cmd.CommandBase
dataDir string
machineTag names.MachineTag
}
func (c *FixitCommand) Info() *cmd.Info {
return &cmd.Info{
Name: "juju-121-upgrades",
Args: "<machine-id>",
Purpose: "run the missing upgrade steps",
}
}
func (c *FixitCommand) SetFlags(f *gnuflag.FlagSet) {
f.StringVar(&c.dataDir, "data-dir", "/var/lib/juju", "directory for juju data")
}
func (c *FixitCommand) Init(args []string) error {
if len(args) == 0 {
return errors.New("missing machine-id")
}
var machineId string
machineId, args = args[0], args[1:]
if !names.IsValidMachine(machineId) {
return errors.Errorf("%q is not a valid machine id", machineId)
}
c.machineTag = names.NewMachineTag(machineId)
return cmd.CheckEmpty(args)
}
func (c *FixitCommand) Run(ctx *cmd.Context) error {
loggo.GetLogger("juju").SetLogLevel(loggo.DEBUG)
conf, err := agent.ReadConfig(agent.ConfigPath(c.dataDir, c.machineTag))
if err != nil {
return err
}
info, ok := conf.MongoInfo()
if !ok {
return errors.Errorf("no state info available")
}
st, err := state.Open(conf.Environment(), info, mongo.DefaultDialOpts(), environs.NewStatePolicy())
if err != nil {
return err
}
defer st.Close()
ctx.Infof("\nStep 1: migrate individual unit ports to openedPorts collection")
if err := state.MigrateUnitPortsToOpenedPorts(st); err != nil {
return err
}
ctx.Infof("\nStep 2: create entries in meter status collection for existing units")
if err := state.CreateUnitMeterStatus(st); err != nil {
return err
}
ctx.Infof("\nStep 3: migrate machine jobs into ones with JobManageNetworking based on rules")
if err := state.MigrateJobManageNetworking(st); err != nil {
return err
}
return nil
}