@Override
  public MachineDetails[] startManagementMachines(final long duration, final TimeUnit unit)
      throws TimeoutException, CloudProvisioningException {

    long endTime = System.currentTimeMillis() + unit.toMillis(duration);

    try {
      azureClient.createAffinityGroup(affinityGroup, location, endTime);

      azureClient.createVirtualNetworkSite(addressSpace, affinityGroup, networkName, endTime);

      azureClient.createStorageAccount(affinityGroup, storageAccountName, endTime);

    } catch (final MicrosoftAzureException e) {
      throw new CloudProvisioningException(e);
    } catch (InterruptedException e) {
      throw new CloudProvisioningException(e);
    }

    int numberOfManagementMachines = this.cloud.getProvider().getNumberOfManagementMachines();

    final ExecutorService executorService =
        Executors.newFixedThreadPool(numberOfManagementMachines);

    try {
      return startManagementMachines(endTime, numberOfManagementMachines, executorService);
    } finally {
      executorService.shutdown();
    }
  }