-
Notifications
You must be signed in to change notification settings - Fork 119
/
Copy pathgnoi_os.go
102 lines (86 loc) · 2.95 KB
/
gnoi_os.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
/* Copyright 2020 Google Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package main
import (
"context"
"flag"
"time"
log "github.com/golang/glog"
gnoiOS "github.com/google/gnxi/gnoi/os"
"github.com/google/gnxi/utils/credentials"
"google.golang.org/grpc"
)
var (
targetAddr = flag.String("target_addr", ":9339", "The target address in the format of host:port")
version = flag.String("version", "", "Version of the OS required when using the activate operation or being installed using the install operation")
osFile = flag.String("os", "", "Path to the OS image for the install operation")
op = flag.String("op", "", "OS service operation. Can be one of: install, activate, verify")
timeOut = flag.Duration("time_out", 5*time.Second, "Timeout for the operation, 5 seconds by default")
readChunkSize = flag.Uint64("chunk_size", 4000000, "How much of the image to load a time, in bytes. Example: -chunk_size 4000000")
client *gnoiOS.Client
ctx context.Context
cancel func()
)
func main() {
flag.Set("logtostderr", "true")
flag.Parse()
opts := credentials.ClientCredentials()
conn, err := grpc.Dial(*targetAddr, opts...)
if err != nil {
log.Exitf("Dialing to %s failed: %v", *targetAddr, err)
}
defer conn.Close()
client = gnoiOS.NewClient(conn)
ctx, cancel = context.WithTimeout(context.Background(), *timeOut)
defer cancel()
ctx = credentials.AttachToContext(ctx)
switch *op {
case "install":
install()
case "activate":
activate()
case "verify":
verify()
default:
flag.Usage()
log.Error("Invalid operation provided. Provide one with -op")
}
}
// install installs the OS image onto the target.
func install() {
if *osFile == "" {
log.Exit("No OS image path provided. Provide one with -os")
}
if err := client.Install(ctx, *osFile, *version, *timeOut, *readChunkSize); err != nil {
log.Exit("Failed Install: ", err)
}
}
// activate activates the OS version to be used upon next reboot on the target.
func activate() {
if *version == "" {
log.Exit("No version provided. Provide one with -version")
}
if err := client.Activate(ctx, *version); err != nil {
log.Exit("Failed Activate: ", err)
}
}
// verify verifies the version of the OS running on the target.
func verify() {
version, activationFailMsg, err := client.Verify(ctx)
if err != nil {
log.Exit("Failed Verify: ", err)
}
if activationFailMsg != "" {
log.Info("Previous activation fail message:", activationFailMsg)
}
log.Info("Running OS version: ", version)
}