LEFT | RIGHT |
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/environs/tools" | 10 "launchpad.net/juju-core/environs/tools" |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 return err | 72 return err |
73 } | 73 } |
74 defer srcFile.Close() | 74 defer srcFile.Close() |
75 // We have to buffer the content, because Put requires the content | 75 // We have to buffer the content, because Put requires the content |
76 // length, but Get only returns us a ReadCloser | 76 // length, but Get only returns us a ReadCloser |
77 buf := &bytes.Buffer{} | 77 buf := &bytes.Buffer{} |
78 nBytes, err := io.Copy(buf, srcFile) | 78 nBytes, err := io.Copy(buf, srcFile) |
79 if err != nil { | 79 if err != nil { |
80 return err | 80 return err |
81 } | 81 } |
82 » log.Infof("cmd/juju: downloaded %v (%dkB), uploading", toolsName, (nByte
s+512)/1024) | 82 » log.Infof("downloaded %v (%dkB), uploading", toolsName, (nBytes+512)/102
4) |
83 fmt.Fprintf(ctx.Stderr, ", download %dkB, uploading\n", (nBytes+512)/102
4) | 83 fmt.Fprintf(ctx.Stderr, ", download %dkB, uploading\n", (nBytes+512)/102
4) |
84 | 84 |
85 if err := target.Put(toolsName, buf, nBytes); err != nil { | 85 if err := target.Put(toolsName, buf, nBytes); err != nil { |
86 return err | 86 return err |
87 } | 87 } |
88 return nil | 88 return nil |
89 } | 89 } |
90 | 90 |
91 func copyTools( | 91 func copyTools( |
92 tools []*state.Tools, source environs.StorageReader, | 92 tools []*state.Tools, source environs.StorageReader, |
93 target environs.Storage, dryRun bool, ctx *cmd.Context, | 93 target environs.Storage, dryRun bool, ctx *cmd.Context, |
94 ) error { | 94 ) error { |
95 for _, tool := range tools { | 95 for _, tool := range tools { |
96 » » log.Infof("cmd/juju: copying %s from %s", tool.Binary, tool.URL) | 96 » » log.Infof("copying %s from %s", tool.Binary, tool.URL) |
97 if dryRun { | 97 if dryRun { |
98 continue | 98 continue |
99 } | 99 } |
100 if err := copyOne(tool, source, target, ctx); err != nil { | 100 if err := copyOne(tool, source, target, ctx); err != nil { |
101 return err | 101 return err |
102 } | 102 } |
103 } | 103 } |
104 return nil | 104 return nil |
105 } | 105 } |
106 | 106 |
107 func (c *SyncToolsCommand) Run(ctx *cmd.Context) error { | 107 func (c *SyncToolsCommand) Run(ctx *cmd.Context) error { |
108 officialEnviron, err := environs.NewFromAttrs(officialBucketAttrs) | 108 officialEnviron, err := environs.NewFromAttrs(officialBucketAttrs) |
109 if err != nil { | 109 if err != nil { |
110 » » log.Errorf("cmd/juju: failed to initialize the official bucket e
nvironment") | 110 » » log.Errorf("failed to initialize the official bucket environment
") |
111 return err | 111 return err |
112 } | 112 } |
113 fmt.Fprintf(ctx.Stderr, "listing the source bucket\n") | 113 fmt.Fprintf(ctx.Stderr, "listing the source bucket\n") |
114 sourceToolsList, err := environs.ListTools(officialEnviron, version.Curr
ent.Major) | 114 sourceToolsList, err := environs.ListTools(officialEnviron, version.Curr
ent.Major) |
115 if err != nil { | 115 if err != nil { |
116 return err | 116 return err |
117 } | 117 } |
118 targetEnv, err := environs.NewFromName(c.EnvName) | 118 targetEnv, err := environs.NewFromName(c.EnvName) |
119 if err != nil { | 119 if err != nil { |
120 » » log.Errorf("cmd/juju: unable to read %q from environment", c.Env
Name) | 120 » » log.Errorf("unable to read %q from environment", c.EnvName) |
121 return err | 121 return err |
122 } | 122 } |
123 toolsToCopy := sourceToolsList.Public | 123 toolsToCopy := sourceToolsList.Public |
124 if !c.allVersions { | 124 if !c.allVersions { |
125 » » toolsToCopy, _ = toolsToCopy.Newest() | 125 » » _, toolsToCopy = toolsToCopy.Newest() |
126 } | 126 } |
127 fmt.Fprintf(ctx.Stderr, "found %d tools in source (%d recent ones)\n", | 127 fmt.Fprintf(ctx.Stderr, "found %d tools in source (%d recent ones)\n", |
128 len(sourceToolsList.Public), len(toolsToCopy)) | 128 len(sourceToolsList.Public), len(toolsToCopy)) |
129 for _, tool := range toolsToCopy { | 129 for _, tool := range toolsToCopy { |
130 » » log.Debugf("cmd/juju: found source tool: %s", tool) | 130 » » log.Debugf("found source tool: %s", tool) |
131 } | 131 } |
132 fmt.Fprintf(ctx.Stderr, "listing target bucket\n") | 132 fmt.Fprintf(ctx.Stderr, "listing target bucket\n") |
133 targetToolsList, err := environs.ListTools(targetEnv, version.Current.Ma
jor) | 133 targetToolsList, err := environs.ListTools(targetEnv, version.Current.Ma
jor) |
134 if err != nil { | 134 if err != nil { |
135 return err | 135 return err |
136 } | 136 } |
137 targetTools := targetToolsList.Private | 137 targetTools := targetToolsList.Private |
138 targetStorage := targetEnv.Storage() | 138 targetStorage := targetEnv.Storage() |
139 if c.publicBucket { | 139 if c.publicBucket { |
140 targetTools = targetToolsList.Public | 140 targetTools = targetToolsList.Public |
141 var ok bool | 141 var ok bool |
142 if targetStorage, ok = targetEnv.PublicStorage().(environs.Stora
ge); !ok { | 142 if targetStorage, ok = targetEnv.PublicStorage().(environs.Stora
ge); !ok { |
143 return fmt.Errorf("Cannot write to PublicStorage") | 143 return fmt.Errorf("Cannot write to PublicStorage") |
144 } | 144 } |
145 } | 145 } |
146 for _, tool := range targetTools { | 146 for _, tool := range targetTools { |
147 » » log.Debugf("cmd/juju: found target tool: %s", tool) | 147 » » log.Debugf("found target tool: %s", tool) |
148 } | 148 } |
149 missing := toolsToCopy.Exclude(targetTools) | 149 missing := toolsToCopy.Exclude(targetTools) |
150 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", |
151 len(targetTools), len(missing)) | 151 len(targetTools), len(missing)) |
152 err = copyTools(missing, officialEnviron.PublicStorage(), targetStorage,
c.dryRun, ctx) | 152 err = copyTools(missing, officialEnviron.PublicStorage(), targetStorage,
c.dryRun, ctx) |
153 if err != nil { | 153 if err != nil { |
154 return err | 154 return err |
155 } | 155 } |
156 fmt.Fprintf(ctx.Stderr, "copied %d tools\n", len(missing)) | 156 fmt.Fprintf(ctx.Stderr, "copied %d tools\n", len(missing)) |
157 return nil | 157 return nil |
158 } | 158 } |
LEFT | RIGHT |