You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by io...@apache.org on 2014/07/10 17:05:41 UTC

git commit: [KARAF-3111] Add the ability to specify text and binary resources (as overrides) in InstanceSettings, create and clone commands.

Repository: karaf
Updated Branches:
  refs/heads/karaf-2.x 19e2415e1 -> 4d0b29667


[KARAF-3111] Add the ability to specify text and binary resources (as overrides) in InstanceSettings, create and clone commands.


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/4d0b2966
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/4d0b2966
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/4d0b2966

Branch: refs/heads/karaf-2.x
Commit: 4d0b29667bf3047a685a8deb44d4ea56a7a35c2b
Parents: 19e2415
Author: Ioannis Canellos <io...@gmail.com>
Authored: Thu Jul 10 17:50:18 2014 +0300
Committer: Ioannis Canellos <io...@gmail.com>
Committed: Thu Jul 10 17:50:48 2014 +0300

----------------------------------------------------------------------
 .../admin/command/AdminCommandSupport.java      | 19 ++++
 .../karaf/admin/command/CloneCommand.java       | 17 +++-
 .../karaf/admin/command/CreateCommand.java      | 22 ++++-
 .../apache/karaf/admin/InstanceSettings.java    | 29 ++++++-
 .../karaf/admin/internal/AdminServiceImpl.java  | 91 +++++++++++---------
 .../admin/internal/AdminServiceImplTest.java    | 15 ++++
 admin/core/src/test/resources/myresource        | 20 +++++
 7 files changed, 161 insertions(+), 52 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/4d0b2966/admin/command/src/main/java/org/apache/karaf/admin/command/AdminCommandSupport.java
----------------------------------------------------------------------
diff --git a/admin/command/src/main/java/org/apache/karaf/admin/command/AdminCommandSupport.java b/admin/command/src/main/java/org/apache/karaf/admin/command/AdminCommandSupport.java
index e830076..7041c4f 100644
--- a/admin/command/src/main/java/org/apache/karaf/admin/command/AdminCommandSupport.java
+++ b/admin/command/src/main/java/org/apache/karaf/admin/command/AdminCommandSupport.java
@@ -20,6 +20,12 @@ import org.apache.karaf.admin.AdminService;
 import org.apache.karaf.admin.Instance;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
 
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 public abstract class AdminCommandSupport extends OsgiCommandSupport {
 
     private AdminService adminService;
@@ -39,4 +45,17 @@ public abstract class AdminCommandSupport extends OsgiCommandSupport {
         }
         return i;
     }
+
+    protected static Map<String, URL> getResources(List<String> resources) throws MalformedURLException {
+        Map<String, URL> result = new HashMap<String, URL>();
+        if (resources != null) {
+            for(String resource : resources) {
+                String path = resource.substring(0, resource.indexOf("="));
+                String location = resource.substring(path.length() + 1);
+                URL url = new URL(location);
+                result.put(path, url);
+            }
+        }
+        return result;
+    }
 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/4d0b2966/admin/command/src/main/java/org/apache/karaf/admin/command/CloneCommand.java
----------------------------------------------------------------------
diff --git a/admin/command/src/main/java/org/apache/karaf/admin/command/CloneCommand.java b/admin/command/src/main/java/org/apache/karaf/admin/command/CloneCommand.java
index 2ee26f8..0daac2f 100644
--- a/admin/command/src/main/java/org/apache/karaf/admin/command/CloneCommand.java
+++ b/admin/command/src/main/java/org/apache/karaf/admin/command/CloneCommand.java
@@ -21,6 +21,10 @@ import org.apache.felix.gogo.commands.Command;
 import org.apache.felix.gogo.commands.Option;
 import org.apache.karaf.admin.InstanceSettings;
 
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+
 /**
  * Clone an existing instance.
  */
@@ -45,15 +49,24 @@ public class CloneCommand extends AdminCommandSupport {
     @Option(name = "-v", aliases = {"--verbose"}, description = "Display actions performed by the command (disabled by default)", required = false, multiValued = false)
     boolean verbose = false;
 
+    @Option(name = "-tr", aliases = {"--text-resource"},
+            description = "Add a text resource to the instance", required = false, multiValued = true)
+    List<String> textResourceLocation;
+
+    @Option(name = "-br", aliases = {"--binary-resource"},
+            description = "Add a text resource to the instance", required = false, multiValued = true)
+    List<String> binaryResourceLocations;
+
     @Argument(index = 0, name = "name", description = "The name of the source container instance", required = true, multiValued = false)
     String name;
 
     @Argument(index = 1, name = "cloneName", description = "The name of the cloned container instance", required = true, multiValued = false)
     String cloneName;
 
-
     protected Object doExecute() throws Exception {
-        InstanceSettings settings = new InstanceSettings(sshPort, rmiRegistryPort, rmiServerPort, location, javaOpts, null, null);
+        Map<String, URL> textResources = getResources(textResourceLocation);
+        Map<String, URL> binaryResources = getResources(binaryResourceLocations);
+        InstanceSettings settings = new InstanceSettings(sshPort, rmiRegistryPort, rmiServerPort, location, javaOpts, null, null, textResources, binaryResources);
         getAdminService().cloneInstance(name, cloneName, settings);
         return null;
     }

http://git-wip-us.apache.org/repos/asf/karaf/blob/4d0b2966/admin/command/src/main/java/org/apache/karaf/admin/command/CreateCommand.java
----------------------------------------------------------------------
diff --git a/admin/command/src/main/java/org/apache/karaf/admin/command/CreateCommand.java b/admin/command/src/main/java/org/apache/karaf/admin/command/CreateCommand.java
index 8c34554..6e7439c 100644
--- a/admin/command/src/main/java/org/apache/karaf/admin/command/CreateCommand.java
+++ b/admin/command/src/main/java/org/apache/karaf/admin/command/CreateCommand.java
@@ -16,7 +16,12 @@
  */
 package org.apache.karaf.admin.command;
 
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
 
 import org.apache.felix.gogo.commands.Argument;
 import org.apache.felix.gogo.commands.Command;
@@ -31,6 +36,9 @@ import org.apache.karaf.features.command.completers.FeatureRepositoryCompleter;
 @Command(scope = "admin", name = "create", description = "Creates a new container instance.")
 public class CreateCommand extends AdminCommandSupport
 {
+
+    private static final Pattern RESOURCE_PATTERN= Pattern.compile("([a-zA-Z0-9_.-]+[/\\\\]*)");
+
     @Option(name = "-s", aliases = {"--ssh-port"}, description = "Port number for remote secure shell connection", required = false, multiValued = false)
     int sshPort = 0;
 
@@ -54,13 +62,21 @@ public class CreateCommand extends AdminCommandSupport
             description = "Additional feature descriptor URLs. This option can be specified multiple times to add multiple URLs", required = false, multiValued = true)
     List<String> featureURLs;
 
+    @Option(name = "-tr", aliases = {"--text-resource"},
+            description = "Add a text resource to the instance", required = false, multiValued = true)
+    List<String> textResourceLocation;
+
+    @Option(name = "-br", aliases = {"--binary-resource"},
+            description = "Add a text resource to the instance", required = false, multiValued = true)
+    List<String> binaryResourceLocations;
+
     @Argument(index = 0, name = "name", description="The name of the new container instance", required = true, multiValued = false)
     String instance = null;
-
     protected Object doExecute() throws Exception {
-        InstanceSettings settings = new InstanceSettings(sshPort, rmiRegistryPort, rmiServerPort, location, javaOpts, featureURLs, features);
+        Map<String, URL> textResources = getResources(textResourceLocation);
+        Map<String, URL> binaryResources = getResources(binaryResourceLocations);
+        InstanceSettings settings = new InstanceSettings(sshPort, rmiRegistryPort, rmiServerPort, location, javaOpts, featureURLs, features, textResources, binaryResources);
         getAdminService().createInstance(instance, settings);
         return null;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/4d0b2966/admin/core/src/main/java/org/apache/karaf/admin/InstanceSettings.java
----------------------------------------------------------------------
diff --git a/admin/core/src/main/java/org/apache/karaf/admin/InstanceSettings.java b/admin/core/src/main/java/org/apache/karaf/admin/InstanceSettings.java
index 9b068cf..c3b9bed 100644
--- a/admin/core/src/main/java/org/apache/karaf/admin/InstanceSettings.java
+++ b/admin/core/src/main/java/org/apache/karaf/admin/InstanceSettings.java
@@ -16,7 +16,12 @@
  */
 package org.apache.karaf.admin;
 
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 public class InstanceSettings {
     private final int sshPort;
@@ -26,15 +31,23 @@ public class InstanceSettings {
     private final String javaOpts;
     private final List<String> featureURLs;
     private final List<String> features;
+    private final Map<String, URL> textResources;
+    private final Map<String, URL> binaryResources;
 
     public InstanceSettings(int sshPort, int rmiRegistryPort, int rmiServerPort, String location, String javaOpts, List<String> featureURLs, List<String> features) {
+       this(sshPort, rmiRegistryPort, rmiServerPort, location, javaOpts, featureURLs, features, new HashMap<String, URL>(), new HashMap<String, URL>());
+    }
+
+    public InstanceSettings(int sshPort, int rmiRegistryPort, int rmiServerPort, String location, String javaOpts, List<String> featureURLs, List<String> features, Map<String, URL> textResources, Map<String, URL> binaryResources) {
         this.sshPort = sshPort;
         this.rmiRegistryPort = rmiRegistryPort;
         this.rmiServerPort = rmiServerPort;
         this.location = location;
         this.javaOpts = javaOpts;
-        this.featureURLs = featureURLs;
-        this.features = features;
+        this.featureURLs = featureURLs != null ? featureURLs : new ArrayList<String>();
+        this.features = features != null ? features : new ArrayList<String>();
+        this.textResources = textResources != null ? textResources : new HashMap<String, URL>();
+        this.binaryResources = binaryResources != null ? binaryResources : new HashMap<String, URL>();
     }
 
     public int getSshPort() {
@@ -58,11 +71,19 @@ public class InstanceSettings {
     }
 
     public List<String> getFeatureURLs() {
-        return featureURLs;
+        return Collections.unmodifiableList(featureURLs);
     }
 
     public List<String> getFeatures() {
-        return features;
+        return Collections.unmodifiableList(features);
+    }
+
+    public Map<String, URL> getTextResources() {
+        return Collections.unmodifiableMap(textResources);
+    }
+
+    public Map<String, URL> getBinaryResources() {
+        return Collections.unmodifiableMap(binaryResources);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/karaf/blob/4d0b2966/admin/core/src/main/java/org/apache/karaf/admin/internal/AdminServiceImpl.java
----------------------------------------------------------------------
diff --git a/admin/core/src/main/java/org/apache/karaf/admin/internal/AdminServiceImpl.java b/admin/core/src/main/java/org/apache/karaf/admin/internal/AdminServiceImpl.java
index 9e0c7d5..bced7b9 100644
--- a/admin/core/src/main/java/org/apache/karaf/admin/internal/AdminServiceImpl.java
+++ b/admin/core/src/main/java/org/apache/karaf/admin/internal/AdminServiceImpl.java
@@ -17,8 +17,6 @@
 package org.apache.karaf.admin.internal;
 
 import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
@@ -29,11 +27,9 @@ import java.io.InputStreamReader;
 import java.io.InterruptedIOException;
 import java.io.OutputStream;
 import java.io.PrintStream;
-import java.io.RandomAccessFile;
 import java.net.Socket;
 import java.net.URL;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
@@ -41,8 +37,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Scanner;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
 
 import org.apache.karaf.admin.AdminService;
 import org.apache.karaf.admin.Instance;
@@ -266,30 +260,33 @@ public class AdminServiceImpl implements AdminService {
                 mkdir(karafBase, "deploy");
                 mkdir(karafBase, "data");
 
-                copyResourceToDir(karafBase, "etc/all.policy", true);
-                copyResourceToDir(karafBase, "etc/config.properties", true);
-                copyResourceToDir(karafBase, "etc/custom.properties", true);
-                copyResourceToDir(karafBase, "etc/java.util.logging.properties", true);
-                copyResourceToDir(karafBase, "etc/jmx.acl.cfg", true);
-                copyResourceToDir(karafBase, "etc/jmx.acl.java.lang.Memory.cfg", true);
-                copyResourceToDir(karafBase, "etc/jmx.acl.org.apache.karaf.bundle.cfg", true);
-                copyResourceToDir(karafBase, "etc/jmx.acl.org.apache.karaf.config.cfg", true);
-                copyResourceToDir(karafBase, "etc/jmx.acl.org.apache.karaf.security.jmx.cfg", true);
-                copyResourceToDir(karafBase, "etc/jmx.acl.osgi.compendium.cm.cfg", true);
-                copyResourceToDir(karafBase, "etc/jre.properties", true);
-                copyResourceToDir(karafBase, "etc/keys.properties", true);
-                copyResourceToDir(karafBase, "etc/org.apache.felix.fileinstall-deploy.cfg", true);
-                copyResourceToDir(karafBase, FEATURES_CFG, true);
-                copyResourceToDir(karafBase, "etc/org.apache.karaf.features.obr.cfg", true);
-                copyResourceToDir(karafBase, "etc/org.apache.karaf.features.repos.cfg", true);
-                copyResourceToDir(karafBase, "etc/org.apache.karaf.jaas.cfg", true);
-                copyResourceToDir(karafBase, "etc/org.apache.karaf.kar.cfg", true);
-                copyResourceToDir(karafBase, "etc/org.apache.karaf.log.cfg", true);
-                copyResourceToDir(karafBase, "etc/org.ops4j.pax.logging.cfg", true);
-                copyResourceToDir(karafBase, "etc/org.ops4j.pax.url.mvn.cfg", true);
-                copyResourceToDir(karafBase, "etc/shell.init.script", true);
-                copyResourceToDir(karafBase, "etc/startup.properties", true);
-                copyResourceToDir(karafBase, "etc/users.properties", true);
+                Map<String, URL> textResources = new HashMap<String, URL>(settings.getTextResources());
+                Map<String, URL> binaryResources = new HashMap<String, URL>(settings.getBinaryResources());
+
+                copyResourceToDir(karafBase, "etc/all.policy", true, textResources);
+                copyResourceToDir(karafBase, "etc/config.properties", true, textResources);
+                copyResourceToDir(karafBase, "etc/custom.properties", true, textResources);
+                copyResourceToDir(karafBase, "etc/java.util.logging.properties", true, textResources);
+                copyResourceToDir(karafBase, "etc/jmx.acl.cfg", true, textResources);
+                copyResourceToDir(karafBase, "etc/jmx.acl.java.lang.Memory.cfg", true, textResources);
+                copyResourceToDir(karafBase, "etc/jmx.acl.org.apache.karaf.bundle.cfg", true, textResources);
+                copyResourceToDir(karafBase, "etc/jmx.acl.org.apache.karaf.config.cfg", true, textResources);
+                copyResourceToDir(karafBase, "etc/jmx.acl.org.apache.karaf.security.jmx.cfg", true, textResources);
+                copyResourceToDir(karafBase, "etc/jmx.acl.osgi.compendium.cm.cfg", true, textResources);
+                copyResourceToDir(karafBase, "etc/jre.properties", true, textResources);
+                copyResourceToDir(karafBase, "etc/keys.properties", true, textResources);
+                copyResourceToDir(karafBase, "etc/org.apache.felix.fileinstall-deploy.cfg", true, textResources);
+                copyResourceToDir(karafBase, FEATURES_CFG, true, textResources);
+                copyResourceToDir(karafBase, "etc/org.apache.karaf.features.obr.cfg", true, textResources);
+                copyResourceToDir(karafBase, "etc/org.apache.karaf.features.repos.cfg", true, textResources);
+                copyResourceToDir(karafBase, "etc/org.apache.karaf.jaas.cfg", true, textResources);
+                copyResourceToDir(karafBase, "etc/org.apache.karaf.kar.cfg", true, textResources);
+                copyResourceToDir(karafBase, "etc/org.apache.karaf.log.cfg", true, textResources);
+                copyResourceToDir(karafBase, "etc/org.ops4j.pax.logging.cfg", true, textResources);
+                copyResourceToDir(karafBase, "etc/org.ops4j.pax.url.mvn.cfg", true, textResources);
+                copyResourceToDir(karafBase, "etc/shell.init.script", true, textResources);
+                copyResourceToDir(karafBase, "etc/startup.properties", true, textResources);
+                copyResourceToDir(karafBase, "etc/users.properties", true, textResources);
 
                 HashMap<String, String> props = new HashMap<String, String>();
                 props.put("${SUBST-KARAF-NAME}", name);
@@ -298,20 +295,20 @@ public class AdminServiceImpl implements AdminService {
                 props.put("${SUBST-SSH-PORT}", Integer.toString(sshPort));
                 props.put("${SUBST-RMI-REGISTRY-PORT}", Integer.toString(rmiRegistryPort));
                 props.put("${SUBST-RMI-SERVER-PORT}", Integer.toString(rmiServerPort));
-                copyFilteredResourceToDir(karafBase, "etc/system.properties", props);
-                copyFilteredResourceToDir(karafBase, "etc/org.apache.karaf.shell.cfg", props);
-                copyFilteredResourceToDir(karafBase, "etc/org.apache.karaf.management.cfg", props);
+                copyFilteredResourceToDir("etc/system.properties", karafBase, textResources, props);
+                copyFilteredResourceToDir("etc/org.apache.karaf.shell.cfg", karafBase, textResources, props);
+                copyFilteredResourceToDir("etc/org.apache.karaf.management.cfg", karafBase, textResources, props);
                 // If we use batch files, use batch files, else use bash scripts (even on cygwin)
                 boolean windows = System.getProperty("os.name").startsWith("Win");
                 boolean cygwin = windows && new File(System.getProperty("karaf.home"), "bin/admin").exists();
                 if (windows && !cygwin) {
-                    copyFilteredResourceToDir(karafBase, "bin/karaf.bat", props);
-                    copyFilteredResourceToDir(karafBase, "bin/start.bat", props);
-                    copyFilteredResourceToDir(karafBase, "bin/stop.bat", props);
+                    copyFilteredResourceToDir("bin/karaf.bat", karafBase, textResources, props);
+                    copyFilteredResourceToDir("bin/start.bat", karafBase, textResources, props);
+                    copyFilteredResourceToDir("bin/stop.bat", karafBase, textResources, props);
                 } else {
-                    copyFilteredResourceToDir(karafBase, "bin/karaf", props);
-                    copyFilteredResourceToDir(karafBase, "bin/start", props);
-                    copyFilteredResourceToDir(karafBase, "bin/stop", props);
+                    copyFilteredResourceToDir("bin/karaf", karafBase, textResources, props);
+                    copyFilteredResourceToDir("bin/start", karafBase, textResources, props);
+                    copyFilteredResourceToDir("bin/stop", karafBase, textResources, props);
                     if (!cygwin) {
                         chmod(new File(karafBase, "bin/karaf"), "a+x");
                         chmod(new File(karafBase, "bin/start"), "a+x");
@@ -321,6 +318,14 @@ public class AdminServiceImpl implements AdminService {
 
                 handleFeatures(new File(karafBase, FEATURES_CFG), settings);
 
+                for (String resource : textResources.keySet()) {
+                    copyFilteredResourceToDir(resource, karafBase, textResources, props);
+                }
+
+                for (String resource : binaryResources.keySet()) {
+                    copyResourceToDir(karafBase, resource, false, binaryResources);
+                }
+
                 String javaOpts = settings.getJavaOpts();
                 if (javaOpts == null || javaOpts.length() == 0) {
                     javaOpts = DEFAULT_JAVA_OPTS;
@@ -856,11 +861,11 @@ public class AdminServiceImpl implements AdminService {
         return result;
     }
 
-    private void copyResourceToDir(File target, String resource, boolean text) throws IOException {
+    private void copyResourceToDir(File target, String resource, boolean text, Map<String, URL> resources) throws IOException {
         File outFile = new File(target, resource);
         if( !outFile.exists() ) {
             println(Ansi.ansi().a("Creating file: ").a(Ansi.Attribute.INTENSITY_BOLD).a(outFile.getPath()).a(Ansi.Attribute.RESET).toString());
-            InputStream is = getClass().getClassLoader().getResourceAsStream("org/apache/karaf/admin/" + resource);
+            InputStream is = resources.containsKey(resource) ? resources.remove(resource).openStream() : getClass().getClassLoader().getResourceAsStream("org/apache/karaf/admin/" + resource);
             try {
                 if( text ) {
                     // Read it line at a time so that we can use the platform line ending when we write it out.
@@ -934,11 +939,11 @@ public class AdminServiceImpl implements AdminService {
         bak.delete();
     }
 
-    private void copyFilteredResourceToDir(File target, String resource, HashMap<String, String> props) throws IOException {
+    private void copyFilteredResourceToDir(String resource, File target, Map<String, URL> resources, HashMap<String, String> props) throws IOException {
         File outFile = new File(target, resource);
         if( !outFile.exists() ) {
             println(Ansi.ansi().a("Creating file: ").a(Ansi.Attribute.INTENSITY_BOLD).a(outFile.getPath()).a(Ansi.Attribute.RESET).toString());
-            InputStream is = getClass().getClassLoader().getResourceAsStream("org/apache/karaf/admin/" + resource);
+            InputStream is = resources.containsKey(resource) ? resources.remove(resource).openStream() : getClass().getClassLoader().getResourceAsStream("org/apache/karaf/admin/" + resource);
             copyAndFilterResource(is, new FileOutputStream(outFile), props);
         }
     }

http://git-wip-us.apache.org/repos/asf/karaf/blob/4d0b2966/admin/core/src/test/java/org/apache/karaf/admin/internal/AdminServiceImplTest.java
----------------------------------------------------------------------
diff --git a/admin/core/src/test/java/org/apache/karaf/admin/internal/AdminServiceImplTest.java b/admin/core/src/test/java/org/apache/karaf/admin/internal/AdminServiceImplTest.java
index cb917d6..049976d 100644
--- a/admin/core/src/test/java/org/apache/karaf/admin/internal/AdminServiceImplTest.java
+++ b/admin/core/src/test/java/org/apache/karaf/admin/internal/AdminServiceImplTest.java
@@ -22,7 +22,10 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.net.URL;
 import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Properties;
 
 import junit.framework.TestCase;
@@ -88,6 +91,18 @@ public class AdminServiceImplTest extends TestCase {
         assertFileExists(instance.getLocation(), "etc/org.ops4j.pax.url.mvn.cfg");
     }
 
+    public void testTextResources() throws Exception {
+        AdminServiceImpl service = new AdminServiceImpl();
+        service.setStorageLocation(new File("target/instances/" + System.currentTimeMillis()));
+        Map<String, URL> textResources = new HashMap<String, URL>();
+        textResources.put("etc/myresource", getClass().getClassLoader().getResource("myresource"));
+
+        InstanceSettings settings = new InstanceSettings(8122, 1122, 44444, getName(), null, null, null, textResources, new HashMap<String, URL>());
+        Instance instance = service.createInstance(getName(), settings);
+
+        assertFileExists(instance.getLocation(), "etc/myresource");
+    }
+
     /**
      * <p>
      * Test the renaming of an existing instance.

http://git-wip-us.apache.org/repos/asf/karaf/blob/4d0b2966/admin/core/src/test/resources/myresource
----------------------------------------------------------------------
diff --git a/admin/core/src/test/resources/myresource b/admin/core/src/test/resources/myresource
new file mode 100644
index 0000000..1616b25
--- /dev/null
+++ b/admin/core/src/test/resources/myresource
@@ -0,0 +1,20 @@
+################################################################################
+#
+#    Licensed to the Apache Software Foundation (ASF) under one or more
+#    contributor license agreements.  See the NOTICE file distributed with
+#    this work for additional information regarding copyright ownership.
+#    The ASF licenses this file to You 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
+#
+#       http://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.
+#
+################################################################################
+
+Yet another empty file!
\ No newline at end of file