EMMA Coverage Report (generated Wed Oct 26 13:47:17 EDT 2011)
[all classes][org.jclouds.compute.callables]

COVERAGE SUMMARY FOR SOURCE FILE [RunScriptOnNodeAsInitScriptUsingSsh.java]

nameclass, %method, %block, %line, %
RunScriptOnNodeAsInitScriptUsingSsh.java0%   (0/2)0%   (0/10)0%   (0/336)0%   (0/41)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class RunScriptOnNodeAsInitScriptUsingSsh0%   (0/1)0%   (0/8)0%   (0/325)0%   (0/39)
RunScriptOnNodeAsInitScriptUsingSsh (Function, InitScriptConfigurationForTask... 0%   (0/1)0%   (0/44)0%   (0/4)
call (): ExecResponse 0%   (0/1)0%   (0/31)0%   (0/5)
createInitScript (InitScriptConfigurationForTasks, String, Statement): InitBu... 0%   (0/1)0%   (0/44)0%   (0/3)
doCall (): ExecResponse 0%   (0/1)0%   (0/127)0%   (0/15)
getInitFile (): String 0%   (0/1)0%   (0/3)0%   (0/1)
init (): RunScriptOnNodeAsInitScriptUsingSsh 0%   (0/1)0%   (0/5)0%   (0/2)
refreshSshIfNewAdminCredentialsConfigured (AdminAccess): void 0%   (0/1)0%   (0/51)0%   (0/7)
setupLinkToInitFile (): void 0%   (0/1)0%   (0/20)0%   (0/2)
     
class RunScriptOnNodeAsInitScriptUsingSsh$10%   (0/1)0%   (0/2)0%   (0/11)0%   (0/3)
RunScriptOnNodeAsInitScriptUsingSsh$1 (RunScriptOnNodeAsInitScriptUsingSsh): ... 0%   (0/1)0%   (0/6)0%   (0/1)
visit (AdminAccess): void 0%   (0/1)0%   (0/5)0%   (0/2)

1/**
2 * Licensed to jclouds, Inc. (jclouds) under one or more
3 * contributor license agreements.  See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership.  jclouds licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License.  You may obtain a copy of the License at
9 *
10 *   http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied.  See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19package org.jclouds.compute.callables;
20 
21import static com.google.common.base.Preconditions.checkNotNull;
22import static com.google.common.base.Preconditions.checkState;
23 
24import java.util.Collections;
25 
26import javax.annotation.Resource;
27import javax.inject.Named;
28 
29import org.jclouds.compute.domain.ExecResponse;
30import org.jclouds.compute.domain.NodeMetadata;
31import org.jclouds.compute.domain.NodeMetadataBuilder;
32import org.jclouds.compute.options.RunScriptOptions;
33import org.jclouds.compute.reference.ComputeServiceConstants;
34import org.jclouds.logging.Logger;
35import org.jclouds.scriptbuilder.InitBuilder;
36import org.jclouds.scriptbuilder.domain.AdminAccessVisitor;
37import org.jclouds.scriptbuilder.domain.AppendFile;
38import org.jclouds.scriptbuilder.domain.OsFamily;
39import org.jclouds.scriptbuilder.domain.Statement;
40import org.jclouds.scriptbuilder.domain.Statements;
41import org.jclouds.scriptbuilder.statements.login.AdminAccess;
42import org.jclouds.ssh.SshClient;
43import org.jclouds.ssh.SshException;
44 
45import com.google.common.base.Function;
46import com.google.common.base.Splitter;
47import com.google.inject.assistedinject.Assisted;
48import com.google.inject.assistedinject.AssistedInject;
49 
50/**
51 * 
52 * @author Adrian Cole
53 */
54public class RunScriptOnNodeAsInitScriptUsingSsh extends SudoAwareInitManager implements RunScriptOnNode {
55   @Resource
56   @Named(ComputeServiceConstants.COMPUTE_LOGGER)
57   protected Logger logger = Logger.NULL;
58 
59   protected final String initFile;
60 
61   /**
62    * @return the absolute path to the file on disk relating to this task.
63    */
64   public String getInitFile() {
65      return initFile;
66   }
67 
68   @AssistedInject
69   public RunScriptOnNodeAsInitScriptUsingSsh(Function<NodeMetadata, SshClient> sshFactory,
70            InitScriptConfigurationForTasks initScriptConfiguration, @Assisted NodeMetadata node,
71            @Assisted Statement script, @Assisted RunScriptOptions options) {
72      super(sshFactory, options.shouldRunAsRoot(), checkNotNull(node, "node"),
73               checkNotNull(script, "script") instanceof InitBuilder ? InitBuilder.class.cast(script)
74                        : createInitScript(checkNotNull(initScriptConfiguration, "initScriptConfiguration"), options
75                                 .getTaskName(), script));
76      this.initFile = String.format(initScriptConfiguration.getInitScriptPattern(), init.getInstanceName());
77   }
78 
79   @Override
80   public RunScriptOnNodeAsInitScriptUsingSsh init() {
81      super.init();
82      return this;
83   }
84 
85   @Override
86   public ExecResponse call() {
87      checkState(ssh != null, "please call init() before invoking call");
88      try {
89         ssh.connect();
90         return doCall();
91      } finally {
92         if (ssh != null)
93            ssh.disconnect();
94      }
95   }
96 
97   public static InitBuilder createInitScript(InitScriptConfigurationForTasks config, String name, Statement script) {
98      if (name == null) {
99         name = "jclouds-script-" + config.getAnonymousTaskSuffixSupplier().get();
100      }
101      return new InitBuilder(name, config.getBasedir() + "/" + name, config.getBasedir() + "/" + name, Collections
102               .<String, String> emptyMap(), Collections.singleton(script));
103   }
104 
105   protected void refreshSshIfNewAdminCredentialsConfigured(AdminAccess input) {
106      if (input.getAdminCredentials() != null && input.shouldGrantSudoToAdminUser()) {
107         ssh.disconnect();
108         logger.debug(">> reconnecting as %s@%s", input.getAdminCredentials().identity, ssh.getHostAddress());
109         ssh = sshFactory.apply(node = NodeMetadataBuilder.fromNodeMetadata(node).adminPassword(null).credentials(
110                  input.getAdminCredentials()).build());
111         ssh.connect();
112         setupLinkToInitFile();
113      }
114   }
115 
116   protected ExecResponse doCall() {
117      try {
118         ssh.put(initFile, init.render(OsFamily.UNIX));
119      } catch (SshException e) {
120         // If there's a problem with the sftp configuration, we can try via ssh exec
121         if (logger.isTraceEnabled())
122            logger.warn(e, "<< (%s) problem using sftp [%s], attempting via sshexec", ssh.toString(), e.getMessage());
123         else
124            logger.warn("<< (%s) problem using sftp [%s], attempting via sshexec", ssh.toString(), e.getMessage());
125         ssh.disconnect();
126         ssh.connect();
127         ssh.exec("rm " + initFile);
128         ssh.exec(Statements.appendFile(initFile, Splitter.on('\n').split(init.render(OsFamily.UNIX)),
129                  AppendFile.MARKER + "_" + init.getInstanceName()).render(OsFamily.UNIX));
130      }
131 
132      ssh.exec("chmod 755 " + initFile);
133      setupLinkToInitFile();
134 
135      runAction("init");
136      init.getInitStatement().accept(new AdminAccessVisitor() {
137 
138         @Override
139         public void visit(AdminAccess input) {
140            refreshSshIfNewAdminCredentialsConfigured(input);
141         }
142 
143      });
144      return runAction("start");
145   }
146 
147   protected void setupLinkToInitFile() {
148      ssh.exec(String.format("ln -fs %s %s", initFile, init.getInstanceName()));
149   }
150 
151}

[all classes][org.jclouds.compute.callables]
EMMA 2.0.5312 (C) Vladimir Roubtsov