Esempio n. 1
0
  @Test
  public void testUpload() throws Exception {
    String featureLocation = System.getProperty("feature.location");
    System.out.println("Testing with feature from:" + featureLocation);
    System.err.println(executeCommand("fabric:create -n"));
    Set<Container> containers =
        ContainerBuilder.create(2)
            .withName("maven")
            .withProfiles("fabric")
            .assertProvisioningResult()
            .build();

    FabricService fabricService = getFabricService();
    IZKClient zookeeper = getZookeeper();
    List<String> children = zookeeper.getChildren(ZkPath.MAVEN_PROXY.getPath("upload"));
    List<String> uploadUrls = new ArrayList<String>();
    for (String child : children) {
      String uploadeUrl =
          ZooKeeperUtils.getSubstitutedPath(
              zookeeper, ZkPath.MAVEN_PROXY.getPath("upload") + "/" + child);
      uploadUrls.add(uploadeUrl);
    }
    // Pick a random maven proxy from the list.
    Random random = new Random();
    int index = random.nextInt(uploadUrls.size());
    String targetUrl = uploadUrls.get(index);

    String uploadUrl = targetUrl + "itest/itest/1.0/itest-1.0-features.xml";
    System.out.println("Using URI: " + uploadUrl);
    DefaultHttpClient client = new DefaultHttpClient();
    HttpPut put = new HttpPut(uploadUrl);
    client
        .getCredentialsProvider()
        .setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("admin", "admin"));

    FileNIOEntity entity = new FileNIOEntity(new File(featureLocation), "text/xml");
    put.setEntity(entity);
    HttpResponse response = client.execute(put);
    System.err.println("Response:" + response.getStatusLine());
    Assert.assertTrue(
        response.getStatusLine().getStatusCode() == 200
            || response.getStatusLine().getStatusCode() == 202);

    System.err.println(
        executeCommand(
            "fabric:profile-edit --repositories mvn:itest/itest/1.0/xml/features default"));
    System.err.println(executeCommand("fabric:profile-edit --features example-cbr default"));
    Provision.waitForContainerStatus(containers, PROVISION_TIMEOUT);
  }
  public void createCluster(List<String> containers, CreateEnsembleOptions options) {
    try {
      if (options.getZookeeperPassword() != null) {
        // do nothing
      } else if (System.getProperties().containsKey(SystemProperties.ZOOKEEPER_PASSWORD)) {
        options.setZookeeperPassword(System.getProperty(SystemProperties.ZOOKEEPER_PASSWORD));
      } else {
        options.setZookeeperPassword(ZooKeeperRetriableUtils.generatePassword());
      }

      if (containers == null || containers.size() == 2) {
        throw new IllegalArgumentException(
            "One or at least 3 containers must be used to create a zookeeper ensemble");
      }
      Configuration config =
          configurationAdmin.getConfiguration("org.fusesource.fabric.zookeeper", null);
      String zooKeeperUrl =
          config != null && config.getProperties() != null
              ? (String) config.getProperties().get("zookeeper.url")
              : null;
      if (zooKeeperUrl == null) {
        if (containers.size() != 1
            || !containers.get(0).equals(System.getProperty(SystemProperties.KARAF_NAME))) {
          throw new FabricException(
              "The first zookeeper cluster must be configured on this container only.");
        }
        createLocalServer(2181, options);
        return;
      }

      String version = getDataStore().getDefaultVersion();

      for (String container : containers) {
        Container c = fabricService.getContainer(container);
        if (ZooKeeperRetriableUtils.exists(zooKeeper, ZkPath.CONTAINER_ALIVE.getPath(container))
            == null) {
          throw new FabricException("The container " + container + " is not alive");
        }
        String containerVersion =
            zooKeeper.getStringData(ZkPath.CONFIG_CONTAINER.getPath(container));
        if (!version.equals(containerVersion)) {
          throw new FabricException(
              "The container " + container + " is not using the default-version:" + version);
        }
      }

      // Find used zookeeper ports
      Map<String, List<Integer>> usedPorts = new HashMap<String, List<Integer>>();
      String oldClusterId =
          ZooKeeperRetriableUtils.get(zooKeeper, ZkPath.CONFIG_ENSEMBLES.getPath());
      if (oldClusterId != null) {
        String profile = "fabric-ensemble-" + oldClusterId;
        String pid = "org.fusesource.fabric.zookeeper.server-" + oldClusterId;

        Map<String, String> p = getDataStore().getConfiguration(version, profile, pid);

        if (p == null) {
          throw new FabricException(
              "Failed to find old cluster configuration for ID " + oldClusterId);
        }

        for (Object n : p.keySet()) {
          String node = (String) n;
          if (node.startsWith("server.")) {
            String data =
                ZooKeeperRetriableUtils.getSubstitutedPath(
                    zooKeeper,
                    ZkPath.CONFIG_ENSEMBLE_PROFILE.getPath("fabric-ensemble-" + oldClusterId)
                        + "/org.fusesource.fabric.zookeeper.server-"
                        + oldClusterId
                        + ".properties#"
                        + node);
            addUsedPorts(usedPorts, data);
          }
        }

        Map<String, String> zkConfig =
            getDataStore().getConfiguration(version, "default", "org.fusesource.fabric.zookeeper");
        if (zkConfig == null) {
          throw new FabricException(
              "Failed to find old zookeeper configuration in default profile");
        }
        String datas =
            ZooKeeperRetriableUtils.getSubstitutedPath(zooKeeper, zkConfig.get("zookeeper.url"));
        for (String data : datas.split(",")) {
          addUsedPorts(usedPorts, data);
        }
      }

      String newClusterId;
      if (oldClusterId == null) {
        newClusterId = "0000";
      } else {
        newClusterId = new DecimalFormat("0000").format(Integer.parseInt(oldClusterId) + 1);
      }

      // create new ensemble
      String ensembleProfile =
          getDataStore().getProfile(version, "fabric-ensemble-" + newClusterId, true);
      getDataStore().setProfileAttribute(version, ensembleProfile, "abstract", "true");
      getDataStore().setProfileAttribute(version, ensembleProfile, "hidden", "true");

      Properties ensembleProperties = new Properties();
      ensembleProperties.put("tickTime", "2000");
      ensembleProperties.put("initLimit", "10");
      ensembleProperties.put("syncLimit", "5");
      ensembleProperties.put("dataDir", "data/zookeeper/" + newClusterId);

      int index = 1;
      String connectionUrl = "";
      String realConnectionUrl = "";
      String containerList = "";
      for (String container : containers) {
        String ip =
            ZooKeeperRetriableUtils.getSubstitutedPath(
                zooKeeper, ZkPath.CONTAINER_IP.getPath(container));

        String minimumPort = String.valueOf(Ports.MIN_PORT_NUMBER);
        String maximumPort = String.valueOf(Ports.MAX_PORT_NUMBER);

        if (zooKeeper.exists(ZkPath.CONTAINER_PORT_MIN.getPath(container)) != null) {
          minimumPort =
              ZooKeeperRetriableUtils.getSubstitutedPath(
                  zooKeeper, ZkPath.CONTAINER_PORT_MIN.getPath(container));
        }

        if (zooKeeper.exists(ZkPath.CONTAINER_PORT_MAX.getPath(container)) != null) {
          maximumPort =
              ZooKeeperRetriableUtils.getSubstitutedPath(
                  zooKeeper, ZkPath.CONTAINER_PORT_MAX.getPath(container));
        }

        String ensembleMemberPid =
            "org.fusesource.fabric.zookeeper.server-" + newClusterId + ".properties";
        Properties ensembleMemberProperties = new Properties();

        // configure this server in the ensemble
        String ensembleMemberProfile =
            getDataStore()
                .getProfile(
                    version,
                    "fabric-ensemble-" + newClusterId + "-" + Integer.toString(index),
                    true);
        getDataStore().setProfileAttribute(version, ensembleMemberProfile, "hidden", "true");
        getDataStore()
            .setProfileAttribute(version, ensembleMemberProfile, "parents", ensembleProfile);

        String port1 =
            Integer.toString(
                findPort(
                    usedPorts,
                    ip,
                    mapPortToRange(Ports.DEFAULT_ZOOKEEPER_SERVER_PORT, minimumPort, maximumPort)));
        if (containers.size() > 1) {
          String port2 =
              Integer.toString(
                  findPort(
                      usedPorts,
                      ip,
                      mapPortToRange(Ports.DEFAULT_ZOOKEEPER_PEER_PORT, minimumPort, maximumPort)));
          String port3 =
              Integer.toString(
                  findPort(
                      usedPorts,
                      ip,
                      mapPortToRange(
                          Ports.DEFAULT_ZOOKEEPER_ELECTION_PORT, minimumPort, maximumPort)));
          ensembleProperties.put(
              "server." + Integer.toString(index),
              "${zk:" + container + "/ip}:" + port2 + ":" + port3);
          ensembleMemberProperties.put("server.id", Integer.toString(index));
        }
        ensembleMemberProperties.put("clientPort", port1);

        getDataStore()
            .setFileConfiguration(
                version,
                ensembleMemberProfile,
                ensembleMemberPid,
                DataStoreHelpers.toBytes(ensembleMemberProperties));

        // add this container to the ensemble
        ZooKeeperRetriableUtils.add(
            zooKeeper,
            "/fabric/configs/versions/" + version + "/containers/" + container,
            "fabric-ensemble-" + newClusterId + "-" + Integer.toString(index));
        if (connectionUrl.length() > 0) {
          connectionUrl += ",";
          realConnectionUrl += ",";
        }
        connectionUrl += "${zk:" + container + "/ip}:" + port1;
        realConnectionUrl += ip + ":" + port1;
        if (containerList.length() > 0) {
          containerList += ",";
        }
        containerList += container;
        index++;
      }

      String ensembleConfigName = "org.fusesource.fabric.zookeeper.server-" + newClusterId;
      getDataStore()
          .setFileConfiguration(
              version,
              ensembleProfile,
              ensembleConfigName,
              DataStoreHelpers.toBytes(ensembleProperties));

      if (oldClusterId != null) {
        Properties properties =
            DataStoreHelpers.toProperties(
                getDataStore()
                    .getConfiguration(version, "default", "org.fusesource.fabric.zookeeper"));
        properties.put(
            "zookeeper.url",
            ZooKeeperRetriableUtils.getSubstitutedData(zooKeeper, realConnectionUrl));
        properties.put("zookeeper.password", options.getZookeeperPassword());
        OsgiZkClient dst = new OsgiZkClient();
        dst.updated(properties);
        try {
          dst.waitForConnected(new Timespan(30, Timespan.TimeUnit.SECOND));

          ZooKeeperRetriableUtils.copy(zooKeeper, dst, "/fabric/registry");
          ZooKeeperRetriableUtils.copy(zooKeeper, dst, "/fabric/authentication");
          ZooKeeperRetriableUtils.copy(zooKeeper, dst, "/fabric/configs");

          // Make sure that the alive zndoe is deleted for each container.
          for (String container : containers) {
            ZookeeperCommandBuilder.delete("/fabric/registry/containers/alive/" + container)
                .execute(dst);
          }

          ZooKeeperRetriableUtils.set(dst, ZkPath.CONFIG_ENSEMBLES.getPath(), newClusterId);
          ZooKeeperRetriableUtils.set(
              dst, ZkPath.CONFIG_ENSEMBLE.getPath(newClusterId), containerList);

          ZooKeeperRetriableUtils.set(dst, ZkPath.CONFIG_ENSEMBLE_URL.getPath(), connectionUrl);
          ZooKeeperRetriableUtils.set(
              dst, ZkPath.CONFIG_ENSEMBLE_PASSWORD.getPath(), options.getZookeeperPassword());
          ZooKeeperRetriableUtils.set(
              zooKeeper, ZkPath.CONFIG_ENSEMBLE_URL.getPath(), connectionUrl);
          ZooKeeperRetriableUtils.set(
              zooKeeper, ZkPath.CONFIG_ENSEMBLE_PASSWORD.getPath(), options.getZookeeperPassword());

          for (String v : zooKeeper.getChildren("/fabric/configs/versions/")) {
            for (String container :
                dst.getChildren("/fabric/configs/versions/" + v + "/containers")) {
              ZooKeeperRetriableUtils.remove(
                  dst,
                  "/fabric/configs/versions/" + v + "/containers/" + container,
                  "fabric-ensemble-" + oldClusterId + "-.*");
            }
            setConfigProperty(
                dst,
                "/fabric/configs/versions/"
                    + v
                    + "/profiles/default/org.fusesource.fabric.zookeeper.properties",
                "zookeeper.password",
                "${zk:" + ZkPath.CONFIG_ENSEMBLE_PASSWORD.getPath() + "}");
            setConfigProperty(
                dst,
                "/fabric/configs/versions/"
                    + v
                    + "/profiles/default/org.fusesource.fabric.zookeeper.properties",
                "zookeeper.url",
                "${zk:" + ZkPath.CONFIG_ENSEMBLE_URL.getPath() + "}");
            setConfigProperty(
                zooKeeper,
                "/fabric/configs/versions/"
                    + v
                    + "/profiles/default/org.fusesource.fabric.zookeeper.properties",
                "zookeeper.password",
                "${zk:" + ZkPath.CONFIG_ENSEMBLE_PASSWORD.getPath() + "}");
            setConfigProperty(
                zooKeeper,
                "/fabric/configs/versions/"
                    + v
                    + "/profiles/default/org.fusesource.fabric.zookeeper.properties",
                "zookeeper.url",
                "${zk:" + ZkPath.CONFIG_ENSEMBLE_URL.getPath() + "}");
          }

        } finally {
          dst.close();
        }
      } else {
        setConfigProperty(
            zooKeeper,
            "/fabric/configs/versions/"
                + version
                + "/profiles/default/org.fusesource.fabric.zookeeper.properties",
            "zookeeper.password",
            "${zk:" + ZkPath.CONFIG_ENSEMBLE_PASSWORD.getPath() + "}");
        setConfigProperty(
            zooKeeper,
            "/fabric/configs/versions/"
                + version
                + "/profiles/default/org.fusesource.fabric.zookeeper.properties",
            "zookeeper.url",
            "${zk:" + ZkPath.CONFIG_ENSEMBLE_URL.getPath() + "}");
      }
    } catch (Exception e) {
      throw new FabricException("Unable to create zookeeper quorum: " + e.getMessage(), e);
    }
  }