Search in sources :

Example 6 with ContainerImpl

use of io.fabric8.internal.ContainerImpl in project fabric8 by jboss-fuse.

the class ContainerLifecycleCommandsTest method testStopSomeMatchingContainers.

@Test
public void testStopSomeMatchingContainers() throws Exception {
    containers("c1", "c2");
    ContainerImpl c1 = newContainer("c1");
    expect(this.fabricService.adapt(CuratorFramework.class)).andReturn(this.curatorFramework);
    expect(this.fabricService.getContainers()).andReturn(new Container[] { c1 }).once();
    this.fabricService.stopContainer(c1, false);
    expect(this.fabricService.adapt(CuratorFramework.class)).andReturn(this.curatorFramework);
    expect(this.fabricService.getContainers()).andReturn(new Container[] { c1 }).once();
    replay(this.fabricService, this.commandSession);
    try {
        this.stop.execute(this.commandSession);
        fail("Should throw FabricException");
    } catch (IllegalArgumentException e) {
        assertThat(e.getMessage().contains(" c2 "), is(true));
    }
    verify(this.fabricService);
}
Also used : Container(io.fabric8.api.Container) ContainerImpl(io.fabric8.internal.ContainerImpl) Test(org.junit.Test)

Example 7 with ContainerImpl

use of io.fabric8.internal.ContainerImpl in project fabric8 by jboss-fuse.

the class ContainerLifecycleCommandsTest method testStopGlobMatchingContainers.

@Test
public void testStopGlobMatchingContainers() throws Exception {
    // should stop c2 once
    // should not touch d1
    containers("c*", "c2");
    ContainerImpl c1 = newContainer("c1");
    ContainerImpl c2 = newContainer("c2");
    ContainerImpl c3 = newContainer("c3");
    ContainerImpl d1 = newContainer("d1");
    expect(this.fabricService.getContainers()).andReturn(new Container[] { c1, c3, c2, d1 }).once();
    expect(this.fabricService.adapt(CuratorFramework.class)).andReturn(this.curatorFramework);
    expect(this.fabricService.getContainers()).andReturn(new Container[] { c1, c3, c2, d1 }).once();
    this.fabricService.stopContainer(c1, false);
    expect(this.fabricService.adapt(CuratorFramework.class)).andReturn(this.curatorFramework);
    expect(this.fabricService.getContainers()).andReturn(new Container[] { c1, c3, c2, d1 }).once();
    this.fabricService.stopContainer(c3, false);
    expect(this.fabricService.adapt(CuratorFramework.class)).andReturn(this.curatorFramework);
    expect(this.fabricService.getContainers()).andReturn(new Container[] { c1, c3, c2, d1 }).once();
    this.fabricService.stopContainer(c2, false);
    replay(this.fabricService, this.commandSession);
    this.stop.execute(this.commandSession);
    verify(this.fabricService);
    String result = new String(this.result.toByteArray());
    assertThat(result.contains("Container 'c1' stopped successfully."), is(true));
    assertThat(result.contains("Container 'c2' stopped successfully."), is(true));
    assertThat(result.contains("Container 'c3' stopped successfully."), is(true));
}
Also used : Container(io.fabric8.api.Container) ContainerImpl(io.fabric8.internal.ContainerImpl) Test(org.junit.Test)

Example 8 with ContainerImpl

use of io.fabric8.internal.ContainerImpl in project fabric8 by jboss-fuse.

the class FabricServiceImpl method createContainers.

@Override
public CreateContainerMetadata[] createContainers(CreateContainerOptions options, CreationStateListener listener) {
    assertValid();
    try {
        final ContainerProvider provider = getProvider(options.getProviderType());
        if (provider == null) {
            throw new FabricException("Unable to find a container provider supporting '" + options.getProviderType() + "'");
        }
        if (!provider.isValidProvider()) {
            throw new FabricException("The provider '" + options.getProviderType() + "' is not valid in current environment");
        }
        String originalName = options.getName();
        if (originalName == null || originalName.length() == 0) {
            throw new FabricException("A name must be specified when creating containers");
        }
        // Only allow containers with valid names to get created.
        FabricValidations.validateContainerName(originalName);
        if (listener == null) {
            listener = new NullCreationStateListener();
        }
        validateProfileDependencies(options);
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        Map optionsMap = mapper.readValue(mapper.writeValueAsString(options), Map.class);
        String versionId = options.getVersion() != null ? options.getVersion() : dataStore.get().getDefaultVersion();
        Set<String> profileIds = options.getProfiles();
        if (profileIds == null || profileIds.isEmpty()) {
            profileIds = new LinkedHashSet<String>();
            profileIds.add("default");
        }
        optionsMap.put("version", versionId);
        optionsMap.put("profiles", profileIds);
        optionsMap.put("number", 0);
        // assign parent resolver if it's a child container, else assign global resolver policy
        if (bootstrapConfig != null) {
            String configuredGlobalResolver = bootstrapConfig.getGlobalResolver();
            if (!Strings.isNullOrEmpty(configuredGlobalResolver)) {
                optionsMap.put("globalResolver", configuredGlobalResolver);
                if (optionsMap.get("resolver") == null) {
                    if (optionsMap.get("parent") == null) {
                        optionsMap.put("resolver", configuredGlobalResolver);
                    }
                }
            }
        }
        final List<CreateContainerMetadata> metadatas = new CopyOnWriteArrayList<CreateContainerMetadata>();
        int orgNumber = options.getNumber();
        int number = Math.max(orgNumber, 1);
        if (orgNumber > 1) {
            originalName = originalName + "1";
        }
        final CountDownLatch latch = new CountDownLatch(number);
        Set<String> ignoreContainerNames = new HashSet<>();
        Container[] containers = getContainers();
        // check that there is no container with the given name
        for (Container container : containers) {
            if (container.getId().equals(options.getName())) {
                throw new IllegalArgumentException("A container with name " + options.getName() + " already exists.");
            }
        }
        for (int i = 1; i <= number; i++) {
            NameValidator validator = Containers.createNameValidator(containers, ignoreContainerNames);
            final String containerName = Containers.createUniqueContainerName(containers, originalName, validator);
            ignoreContainerNames.add(containerName);
            optionsMap.put("name", containerName);
            // Check if datastore configuration has been specified and fallback to current container settings.
            if (!hasValidDataStoreProperties(optionsMap)) {
                optionsMap.put("dataStoreProperties", profileRegistry.get().getDataStoreProperties());
            }
            Class cl = options.getClass().getClassLoader().loadClass(options.getClass().getName() + "$Builder");
            CreateContainerBasicOptions.Builder builder = (CreateContainerBasicOptions.Builder) mapper.readValue(mapper.writeValueAsString(optionsMap), cl);
            // We always want to pass the obfuscated version of the password to the container provider.
            builder = (CreateContainerBasicOptions.Builder) builder.zookeeperPassword(PasswordEncoder.encode(getZookeeperPassword()));
            final CreateContainerOptions containerOptions = builder.build();
            final CreationStateListener containerListener = listener;
            final FabricService fabricService = this;
            new Thread("Creating container " + containerName) {

                public void run() {
                    try {
                        if (dataStore.get().hasContainer(containerName)) {
                            CreateContainerBasicMetadata metadata = new CreateContainerBasicMetadata();
                            metadata.setContainerName(containerName);
                            metadata.setCreateOptions(containerOptions);
                            metadata.setFailure(new IllegalArgumentException("A container with name " + containerName + " already exists."));
                            metadatas.add(metadata);
                            return;
                        }
                        dataStore.get().createContainerConfig(containerOptions);
                        CreateContainerMetadata metadata = provider.create(containerOptions, containerListener);
                        if (metadata.isSuccess()) {
                            Container parent = containerOptions.getParent() != null ? getContainer(containerOptions.getParent()) : null;
                            // TODO: We need to make sure that this entries are somehow added even to ensemble servers.
                            if (!containerOptions.isEnsembleServer()) {
                                dataStore.get().createContainerConfig(metadata);
                            }
                            ContainerImpl container = new ContainerImpl(parent, metadata.getContainerName(), FabricServiceImpl.this);
                            metadata.setContainer(container);
                            LOGGER.info("The container " + metadata.getContainerName() + " has been successfully created");
                        } else {
                            LOGGER.warn("The creation of the container " + metadata.getContainerName() + " has failed", metadata.getFailure());
                            dataStore.get().deleteContainer(fabricService, containerOptions.getName());
                        }
                        metadatas.add(metadata);
                    } catch (Throwable t) {
                        CreateContainerBasicMetadata metadata = new CreateContainerBasicMetadata();
                        metadata.setContainerName(containerName);
                        metadata.setCreateOptions(containerOptions);
                        metadata.setFailure(t);
                        metadatas.add(metadata);
                        dataStore.get().deleteContainer(fabricService, containerOptions.getName());
                    } finally {
                        latch.countDown();
                    }
                }
            }.start();
        }
        if (!latch.await(30, TimeUnit.MINUTES)) {
            throw new FabricException("Timeout waiting for container creation");
        }
        return metadatas.toArray(new CreateContainerMetadata[metadatas.size()]);
    } catch (Exception e) {
        LOGGER.error("Failed to create containers " + e, e);
        throw FabricException.launderThrowable(e);
    }
}
Also used : ContainerProvider(io.fabric8.api.ContainerProvider) NullCreationStateListener(io.fabric8.api.NullCreationStateListener) NameValidator(io.fabric8.api.NameValidator) ProfileBuilder(io.fabric8.api.ProfileBuilder) FabricException(io.fabric8.api.FabricException) CreateContainerOptions(io.fabric8.api.CreateContainerOptions) Container(io.fabric8.api.Container) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) HashSet(java.util.HashSet) LinkedHashSet(java.util.LinkedHashSet) CreateContainerMetadata(io.fabric8.api.CreateContainerMetadata) CountDownLatch(java.util.concurrent.CountDownLatch) CreateContainerBasicMetadata(io.fabric8.api.CreateContainerBasicMetadata) ProfileDependencyException(io.fabric8.api.ProfileDependencyException) EncryptionOperationNotPossibleException(org.jasypt.exceptions.EncryptionOperationNotPossibleException) FabricException(io.fabric8.api.FabricException) IOException(java.io.IOException) NullCreationStateListener(io.fabric8.api.NullCreationStateListener) CreationStateListener(io.fabric8.api.CreationStateListener) FabricService(io.fabric8.api.FabricService) ContainerImpl(io.fabric8.internal.ContainerImpl) CreateContainerBasicOptions(io.fabric8.api.CreateContainerBasicOptions) Map(java.util.Map) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) SortedMap(java.util.SortedMap) HashMap(java.util.HashMap) TreeMap(java.util.TreeMap) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList)

Example 9 with ContainerImpl

use of io.fabric8.internal.ContainerImpl in project fabric8 by jboss-fuse.

the class ContainerPlaceholderResolverTest method setUp.

@Before
public void setUp() {
    fabricService = createMock(FabricService.class);
    dataStore = createMock(DataStore.class);
    expect(fabricService.getCurrentContainerName()).andReturn("root").anyTimes();
    expect(fabricService.adapt(DataStore.class)).andReturn(dataStore).anyTimes();
    expect(fabricService.getContainer(EasyMock.<String>anyObject())).andStubAnswer(new IAnswer<Container>() {

        @Override
        public Container answer() throws Throwable {
            return new ContainerImpl(null, (String) EasyMock.getCurrentArguments()[0], fabricService);
        }
    });
    expect(dataStore.getContainerAttribute(eq("root"), eq(DataStore.ContainerAttribute.Ip), eq(""), eq(false), eq(true))).andReturn(ip).anyTimes();
    expect(dataStore.getContainerAttribute(eq("root"), eq(DataStore.ContainerAttribute.LocalHostName), eq(""), eq(false), eq(true))).andReturn(localhostname).anyTimes();
    expect(dataStore.getContainerAttribute(eq("root"), eq(DataStore.ContainerAttribute.BindAddress), eq(""), eq(false), eq(true))).andReturn(bindaddress).anyTimes();
    expect(dataStore.getContainerAttribute(eq("root"), eq(DataStore.ContainerAttribute.Resolver), eq(""), eq(false), eq(true))).andReturn(containerResolver).anyTimes();
    replay(fabricService);
    replay(dataStore);
}
Also used : Container(io.fabric8.api.Container) FabricService(io.fabric8.api.FabricService) ContainerImpl(io.fabric8.internal.ContainerImpl) DataStore(io.fabric8.api.DataStore) Before(org.junit.Before)

Example 10 with ContainerImpl

use of io.fabric8.internal.ContainerImpl in project fabric8 by jboss-fuse.

the class ContainerLifecycleCommandsTest method testStopNoGlobMatchedContainers.

@Test
public void testStopNoGlobMatchedContainers() throws Exception {
    containers("d*");
    ContainerImpl c1 = newContainer("c1");
    ContainerImpl c2 = newContainer("c2");
    ContainerImpl c3 = newContainer("c3");
    expect(this.fabricService.getContainers()).andReturn(new Container[] { c1, c3, c2 });
    replay(this.fabricService, this.commandSession);
    this.stop.execute(this.commandSession);
    verify(this.fabricService);
    assertThat(new String(this.result.toByteArray()).trim(), is("Please specify container name(s). Your pattern didn't match any container name."));
}
Also used : ContainerImpl(io.fabric8.internal.ContainerImpl) Test(org.junit.Test)

Aggregations

ContainerImpl (io.fabric8.internal.ContainerImpl)11 Container (io.fabric8.api.Container)6 Test (org.junit.Test)6 FabricService (io.fabric8.api.FabricService)4 DataStore (io.fabric8.api.DataStore)3 FabricException (io.fabric8.api.FabricException)2 HashMap (java.util.HashMap)2 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)2 CuratorFramework (org.apache.curator.framework.CuratorFramework)2 Before (org.junit.Before)2 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 ContainerProvider (io.fabric8.api.ContainerProvider)1 CreateContainerBasicMetadata (io.fabric8.api.CreateContainerBasicMetadata)1 CreateContainerBasicOptions (io.fabric8.api.CreateContainerBasicOptions)1 CreateContainerMetadata (io.fabric8.api.CreateContainerMetadata)1 CreateContainerOptions (io.fabric8.api.CreateContainerOptions)1 CreationStateListener (io.fabric8.api.CreationStateListener)1 NameValidator (io.fabric8.api.NameValidator)1 NullCreationStateListener (io.fabric8.api.NullCreationStateListener)1 PlaceholderResolver (io.fabric8.api.PlaceholderResolver)1