veyron/services/mgmt/node/impl: address a TODO to consolidate generateCommand with genCmd

Change-Id: I0ffa875b38e4712694441945884adae43d1f2542
diff --git a/services/mgmt/node/impl/app_invoker.go b/services/mgmt/node/impl/app_invoker.go
index 3571978..efbfe8e 100644
--- a/services/mgmt/node/impl/app_invoker.go
+++ b/services/mgmt/node/impl/app_invoker.go
@@ -346,39 +346,14 @@
 	return nil
 }
 
-func generateCommand(envelope *application.Envelope, binPath, instanceDir string) (*exec.Cmd, error) {
-	// TODO(caprita): For the purpose of isolating apps, we should run them
-	// as different users.  We'll need to either use the root process or a
-	// suid script to be able to do it.
-	cmd := exec.Command(binPath)
-	// TODO(caprita): Also pass in configuration info like NAMESPACE_ROOT to
-	// the app (to point to the device mounttable).
-	cmd.Env = envelope.Env
-	rootDir := filepath.Join(instanceDir, "root")
-	if err := mkdir(rootDir); err != nil {
-		return nil, err
-	}
-	cmd.Dir = rootDir
-	logDir := filepath.Join(instanceDir, "logs")
-	if err := mkdir(logDir); err != nil {
-		return nil, err
-	}
-	timestamp := time.Now().UnixNano()
-	var err error
+func openWriteFile(path string) (*os.File, error) {
 	perm := os.FileMode(0600)
-	cmd.Stdout, err = os.OpenFile(filepath.Join(logDir, fmt.Sprintf("STDOUT-%d", timestamp)), os.O_WRONLY|os.O_CREATE, perm)
+	file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, perm)
 	if err != nil {
-		return nil, err
+		vlog.Errorf("OpenFile(%v) failed: %v", path, err)
+		return nil, errOperationFailed
 	}
-
-	cmd.Stderr, err = os.OpenFile(filepath.Join(logDir, fmt.Sprintf("STDERR-%d", timestamp)), os.O_WRONLY|os.O_CREATE, perm)
-	if err != nil {
-		return nil, err
-	}
-	// Set up args and env.
-	cmd.Args = append(cmd.Args, "--log_dir=../logs")
-	cmd.Args = append(cmd.Args, envelope.Args...)
-	return cmd, nil
+	return file, nil
 }
 
 // installationDir returns the path to the directory containing the app
@@ -446,12 +421,32 @@
 		vlog.Errorf("Stat(%v) failed: %v", binPath, err)
 		return nil, errOperationFailed
 	}
-	// TODO(caprita): Fold generateCommand inline here.
-	cmd, err := generateCommand(envelope, binPath, instanceDir)
-	if err != nil {
-		vlog.Errorf("generateCommand(%v, %v, %v) failed: %v", envelope, binPath, instanceDir, err)
-		return nil, errOperationFailed
+	// TODO(caprita): For the purpose of isolating apps, we should run them
+	// as different users.  We'll need to either use the root process or a
+	// suid script to be able to do it.
+	cmd := exec.Command(binPath)
+	// TODO(caprita): Also pass in configuration info like NAMESPACE_ROOT to
+	// the app (to point to the device mounttable).
+	cmd.Env = envelope.Env
+	rootDir := filepath.Join(instanceDir, "root")
+	if err := mkdir(rootDir); err != nil {
+		return nil, err
 	}
+	cmd.Dir = rootDir
+	logDir := filepath.Join(instanceDir, "logs")
+	if err := mkdir(logDir); err != nil {
+		return nil, err
+	}
+	timestamp := time.Now().UnixNano()
+	if cmd.Stdout, err = openWriteFile(filepath.Join(logDir, fmt.Sprintf("STDOUT-%d", timestamp))); err != nil {
+		return nil, err
+	}
+	if cmd.Stderr, err = openWriteFile(filepath.Join(logDir, fmt.Sprintf("STDERR-%d", timestamp))); err != nil {
+		return nil, err
+	}
+	// Set up args and env.
+	cmd.Args = append(cmd.Args, "--log_dir=../logs")
+	cmd.Args = append(cmd.Args, envelope.Args...)
 	return cmd, nil
 }