LEFT | RIGHT |
(no file at all) | |
1 package main | 1 package main |
2 | 2 |
3 import ( | 3 import ( |
4 "bytes" | 4 "bytes" |
5 "fmt" | 5 "fmt" |
6 "io" | 6 "io" |
7 "launchpad.net/gnuflag" | 7 "launchpad.net/gnuflag" |
8 "launchpad.net/juju-core/cmd" | 8 "launchpad.net/juju-core/cmd" |
9 "launchpad.net/juju-core/environs" | 9 "launchpad.net/juju-core/environs" |
10 "launchpad.net/juju-core/log" | 10 "launchpad.net/juju-core/log" |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 return cmd.CheckEmpty(args) | 51 return cmd.CheckEmpty(args) |
52 } | 52 } |
53 | 53 |
54 var officialBucketAttrs = map[string]interface{}{ | 54 var officialBucketAttrs = map[string]interface{}{ |
55 "name": "juju-public", | 55 "name": "juju-public", |
56 "type": "ec2", | 56 "type": "ec2", |
57 "control-bucket": "juju-dist", | 57 "control-bucket": "juju-dist", |
58 "access-key": "", | 58 "access-key": "", |
59 "secret-key": "", | 59 "secret-key": "", |
60 "authorized-keys": "not-really", // We shouldn't need ssh access | 60 "authorized-keys": "not-really", // We shouldn't need ssh access |
61 } | |
62 | |
63 // Find the set of tools at the 'latest' version | |
64 func findNewest(fullTools []*state.Tools) []*state.Tools { | |
65 // This assumes the zero version of Number is always less than a real | |
66 // number, but we don't have negative versions, so this should be fine | |
67 var curBest version.Number | |
68 var res []*state.Tools | |
69 for _, tool := range fullTools { | |
70 if curBest.Less(tool.Number) { | |
71 // This tool is newer than our current best, | |
72 // so reset the list | |
73 res = []*state.Tools{tool} | |
74 curBest = tool.Number | |
75 } else if curBest == tool.Number { | |
76 res = append(res, tool) | |
77 } | |
78 } | |
79 return res | |
80 } | |
81 | |
82 // Find tools that aren't present in target | |
83 func findMissing(sourceTools, targetTools []*state.Tools) []*state.Tools { | |
84 target := make(map[version.Binary]bool, len(targetTools)) | |
85 for _, tool := range targetTools { | |
86 target[tool.Binary] = true | |
87 } | |
88 var res []*state.Tools | |
89 for _, tool := range sourceTools { | |
90 if !target[tool.Binary] { | |
91 res = append(res, tool) | |
92 } | |
93 } | |
94 return res | |
95 } | 61 } |
96 | 62 |
97 func copyOne( | 63 func copyOne( |
98 tool *state.Tools, source environs.StorageReader, | 64 tool *state.Tools, source environs.StorageReader, |
99 target environs.Storage, ctx *cmd.Context, | 65 target environs.Storage, ctx *cmd.Context, |
100 ) error { | 66 ) error { |
101 toolsPath := environs.ToolsStoragePath(tool.Binary) | 67 toolsPath := environs.ToolsStoragePath(tool.Binary) |
102 fmt.Fprintf(ctx.Stderr, "copying %v", toolsPath) | 68 fmt.Fprintf(ctx.Stderr, "copying %v", toolsPath) |
103 srcFile, err := source.Get(toolsPath) | 69 srcFile, err := source.Get(toolsPath) |
104 if err != nil { | 70 if err != nil { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 if err != nil { | 114 if err != nil { |
149 return err | 115 return err |
150 } | 116 } |
151 targetEnv, err := environs.NewFromName(c.EnvName) | 117 targetEnv, err := environs.NewFromName(c.EnvName) |
152 if err != nil { | 118 if err != nil { |
153 log.Errorf("cmd/juju: unable to read %q from environment", c.Env
Name) | 119 log.Errorf("cmd/juju: unable to read %q from environment", c.Env
Name) |
154 return err | 120 return err |
155 } | 121 } |
156 toolsToCopy := sourceToolsList.Public | 122 toolsToCopy := sourceToolsList.Public |
157 if !c.allVersions { | 123 if !c.allVersions { |
158 » » toolsToCopy = findNewest(toolsToCopy) | 124 » » toolsToCopy = toolsToCopy.Newest() |
159 } | 125 } |
160 fmt.Fprintf(ctx.Stderr, "found %d tools in source (%d recent ones)\n", | 126 fmt.Fprintf(ctx.Stderr, "found %d tools in source (%d recent ones)\n", |
161 len(sourceToolsList.Public), len(toolsToCopy)) | 127 len(sourceToolsList.Public), len(toolsToCopy)) |
162 for _, tool := range toolsToCopy { | 128 for _, tool := range toolsToCopy { |
163 log.Debugf("cmd/juju: found source tool: %s", tool) | 129 log.Debugf("cmd/juju: found source tool: %s", tool) |
164 } | 130 } |
165 fmt.Fprintf(ctx.Stderr, "listing target bucket\n") | 131 fmt.Fprintf(ctx.Stderr, "listing target bucket\n") |
166 targetToolsList, err := environs.ListTools(targetEnv, version.Current.Ma
jor) | 132 targetToolsList, err := environs.ListTools(targetEnv, version.Current.Ma
jor) |
167 if err != nil { | 133 if err != nil { |
168 return err | 134 return err |
169 } | 135 } |
170 for _, tool := range targetToolsList.Private { | 136 for _, tool := range targetToolsList.Private { |
171 log.Debugf("cmd/juju: found target tool: %s", tool) | 137 log.Debugf("cmd/juju: found target tool: %s", tool) |
172 } | 138 } |
173 targetTools := targetToolsList.Private | 139 targetTools := targetToolsList.Private |
174 targetStorage := targetEnv.Storage() | 140 targetStorage := targetEnv.Storage() |
175 if c.publicBucket { | 141 if c.publicBucket { |
176 targetTools = targetToolsList.Public | 142 targetTools = targetToolsList.Public |
177 var ok bool | 143 var ok bool |
178 if targetStorage, ok = targetEnv.PublicStorage().(environs.Stora
ge); !ok { | 144 if targetStorage, ok = targetEnv.PublicStorage().(environs.Stora
ge); !ok { |
179 return fmt.Errorf("Cannot write to PublicStorage") | 145 return fmt.Errorf("Cannot write to PublicStorage") |
180 } | 146 } |
181 | 147 |
182 } | 148 } |
183 » missing := findMissing(toolsToCopy, targetTools) | 149 » missing := toolsToCopy.Exclude(targetTools) |
184 fmt.Fprintf(ctx.Stdout, "found %d tools in target; %d tools to be copied
\n", | 150 fmt.Fprintf(ctx.Stdout, "found %d tools in target; %d tools to be copied
\n", |
185 len(targetTools), len(missing)) | 151 len(targetTools), len(missing)) |
186 err = copyTools(missing, officialEnviron.PublicStorage(), targetStorage,
c.dryRun, ctx) | 152 err = copyTools(missing, officialEnviron.PublicStorage(), targetStorage,
c.dryRun, ctx) |
187 if err != nil { | 153 if err != nil { |
188 return err | 154 return err |
189 } | 155 } |
190 fmt.Fprintf(ctx.Stderr, "copied %d tools\n", len(missing)) | 156 fmt.Fprintf(ctx.Stderr, "copied %d tools\n", len(missing)) |
191 return nil | 157 return nil |
192 } | 158 } |
LEFT | RIGHT |