com.abiquo.apiclient.TemplatesApi.java Source code

Java tutorial

Introduction

Here is the source code for com.abiquo.apiclient.TemplatesApi.java

Source

/**
 * Copyright (C) 2008 Abiquo Holdings S.L.
 *
 * Licensed 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.
 */
package com.abiquo.apiclient;

import static com.abiquo.apiclient.domain.ApiPath.ENTERPRISES_URL;
import static com.abiquo.apiclient.domain.Links.create;
import static com.abiquo.server.core.task.TaskState.FINISHED_SUCCESSFULLY;
import static com.google.common.base.Preconditions.checkNotNull;

import java.util.concurrent.TimeUnit;

import javax.ws.rs.core.MediaType;

import com.abiquo.apiclient.domain.Links;
import com.abiquo.apiclient.domain.options.TemplateListOptions;
import com.abiquo.model.enumerator.VMTemplateState;
import com.abiquo.model.transport.AcceptedRequestDto;
import com.abiquo.server.core.appslibrary.ConversionDto;
import com.abiquo.server.core.appslibrary.ConversionsDto;
import com.abiquo.server.core.appslibrary.DatacenterRepositoryDto;
import com.abiquo.server.core.appslibrary.TemplateDefinitionDto;
import com.abiquo.server.core.appslibrary.TemplateDefinitionListDto;
import com.abiquo.server.core.appslibrary.VirtualMachineTemplateDto;
import com.abiquo.server.core.appslibrary.VirtualMachineTemplatePersistentDto;
import com.abiquo.server.core.appslibrary.VirtualMachineTemplateRequestDto;
import com.abiquo.server.core.appslibrary.VirtualMachineTemplatesDto;
import com.abiquo.server.core.cloud.VirtualDatacenterDto;
import com.abiquo.server.core.cloud.VirtualMachineDto;
import com.abiquo.server.core.cloud.VirtualMachineInstanceDto;
import com.abiquo.server.core.enterprise.EnterpriseDto;
import com.abiquo.server.core.infrastructure.DatacenterDto;
import com.abiquo.server.core.infrastructure.storage.TierDto;
import com.abiquo.server.core.task.TaskDto;
import com.abiquo.server.core.task.TasksDto;
import com.google.common.base.Stopwatch;
import com.google.common.reflect.TypeToken;
import com.google.common.util.concurrent.Uninterruptibles;

public class TemplatesApi {
    private final RestClient client;

    // Package private constructor to be used only by the ApiClient
    TemplatesApi(final RestClient client) {
        this.client = checkNotNull(client, "client cannot be null");
    }

    public Iterable<VirtualMachineTemplateDto> listTemplates(final VirtualDatacenterDto vdc) {
        return client.list(vdc.searchLink("templates").getHref(), VirtualMachineTemplatesDto.MEDIA_TYPE,
                VirtualMachineTemplatesDto.class);
    }

    public Iterable<VirtualMachineTemplateDto> listTemplates(final VirtualDatacenterDto vdc,
            final TemplateListOptions options) {
        return client.list(vdc.searchLink("templates").getHref(), options.queryParams(),
                VirtualMachineTemplatesDto.MEDIA_TYPE, VirtualMachineTemplatesDto.class);
    }

    public Iterable<VirtualMachineTemplateDto> listTemplates(final DatacenterRepositoryDto repository) {
        return client.list(repository.searchLink("virtualmachinetemplates").getHref(),
                VirtualMachineTemplatesDto.MEDIA_TYPE, VirtualMachineTemplatesDto.class);
    }

    public Iterable<VirtualMachineTemplateDto> listTemplates(final DatacenterRepositoryDto repository,
            final TemplateListOptions options) {
        return client.list(repository.searchLink("virtualmachinetemplates").getHref(), options.queryParams(),
                VirtualMachineTemplatesDto.MEDIA_TYPE, VirtualMachineTemplatesDto.class);
    }

    public VirtualMachineTemplateDto instanceVirtualMachine(final VirtualMachineDto vm, final String snapshotName,
            final int pollInterval, final int maxWait, final TimeUnit timeUnit) {
        VirtualMachineInstanceDto instance = new VirtualMachineInstanceDto();
        instance.setInstanceName(snapshotName);
        AcceptedRequestDto<String> acceptedRequest = client.post(vm.searchLink("instance").getHref(),
                AcceptedRequestDto.MEDIA_TYPE, VirtualMachineInstanceDto.MEDIA_TYPE, instance,
                new TypeToken<AcceptedRequestDto<String>>() {
                    private static final long serialVersionUID = -6348281615419377868L;
                });

        TaskDto task = client.waitForTask(acceptedRequest, pollInterval, maxWait, timeUnit);
        if (FINISHED_SUCCESSFULLY != task.getState()) {
            throw new RuntimeException("Virtual machine instance operation failed");
        }

        return client.get(task.searchLink("result").getHref(), VirtualMachineTemplateDto.MEDIA_TYPE,
                VirtualMachineTemplateDto.class);
    }

    public VirtualMachineTemplateDto promoteInstance(final VirtualMachineTemplateDto template,
            final String promotedName, final int pollInterval, final int maxWait, final TimeUnit timeUnit) {
        VirtualMachineTemplateRequestDto promote = new VirtualMachineTemplateRequestDto();
        promote.addLink(create("virtualmachinetemplate", template.getEditLink().getHref(),
                VirtualMachineTemplateDto.SHORT_MEDIA_TYPE_JSON));
        promote.setPromotedName(promotedName);
        AcceptedRequestDto<String> acceptedRequest = client.post(
                template.searchLink("datacenterrepository").getHref() + "/virtualmachinetemplates",
                AcceptedRequestDto.MEDIA_TYPE, VirtualMachineTemplateRequestDto.MEDIA_TYPE, promote,
                new TypeToken<AcceptedRequestDto<String>>() {
                    private static final long serialVersionUID = -6348281615419377868L;
                });

        TaskDto task = client.waitForTask(acceptedRequest, pollInterval, maxWait, timeUnit);
        if (FINISHED_SUCCESSFULLY != task.getState()) {
            throw new RuntimeException("Promote instance operation failed");
        }

        return client.get(task.searchLink("result").getHref(), VirtualMachineTemplateDto.MEDIA_TYPE,
                VirtualMachineTemplateDto.class);
    }

    public void refreshAppslibrary(final EnterpriseDto enterprise, final DatacenterDto datacenter,
            final int pollInterval, final int maxWait, final TimeUnit timeUnit) {
        AcceptedRequestDto<String> acceptedRequest = client.put(
                String.format("%s/%s/actions/refresh", enterprise.searchLink("datacenterrepositories").getHref(),
                        datacenter.getId()),
                AcceptedRequestDto.MEDIA_TYPE, new TypeToken<AcceptedRequestDto<String>>() {
                    private static final long serialVersionUID = -6348281615419377868L;
                });

        TaskDto task = client.waitForTask(acceptedRequest, pollInterval, maxWait, timeUnit);
        if (FINISHED_SUCCESSFULLY != task.getState()) {
            throw new RuntimeException("Refresh repository operation failed");
        }
    }

    public DatacenterRepositoryDto getDatacenterRepository(final EnterpriseDto enterprise,
            final DatacenterDto datacenter) {
        return client.get(enterprise.searchLink("datacenterrepositories").getHref() + "/" + datacenter.getId(),
                DatacenterRepositoryDto.MEDIA_TYPE, DatacenterRepositoryDto.class);
    }

    public VirtualMachineTemplateDto createPersistent(final VirtualDatacenterDto vdc,
            final VirtualMachineTemplateDto vmt, final String persistentTemplateName, final TierDto tier,
            final int pollInterval, final int maxWait, final TimeUnit unit) {
        VirtualMachineTemplatePersistentDto persistentTemplateDto = new VirtualMachineTemplatePersistentDto();
        persistentTemplateDto.setPersistentTemplateName(persistentTemplateName);
        persistentTemplateDto.setPersistentVolumeName(persistentTemplateDto.getPersistentTemplateName());
        persistentTemplateDto
                .addLink(create("tier", tier.searchLink("self").getHref(), tier.searchLink("self").getType()));
        persistentTemplateDto
                .addLink(create("virtualdatacenter", vdc.getEditLink().getHref(), vdc.getEditLink().getType()));
        persistentTemplateDto.addLink(
                create("virtualmachinetemplate", vmt.getEditLink().getHref(), vmt.getEditLink().getType()));

        AcceptedRequestDto<String> acceptedRequest = client.post(
                vmt.searchLink("datacenterrepository").getHref() + "/virtualmachinetemplates",
                AcceptedRequestDto.MEDIA_TYPE, VirtualMachineTemplatePersistentDto.MEDIA_TYPE,
                persistentTemplateDto, new TypeToken<AcceptedRequestDto<String>>() {
                    private static final long serialVersionUID = -6348281615419377868L;
                });

        TaskDto task = client.waitForTask(acceptedRequest, pollInterval, maxWait, unit);
        if (FINISHED_SUCCESSFULLY != task.getState()) {
            throw new RuntimeException("Persistent operation failed");
        }

        return client.get(task.searchLink("result").getHref(), VirtualMachineTemplateDto.MEDIA_TYPE,
                VirtualMachineTemplateDto.class);
    }

    public Iterable<TaskDto> getVirtualMachineTemplateTasks(final VirtualMachineTemplateDto vmt) {
        return client.list(vmt.searchLink("tasks").getHref(), TasksDto.MEDIA_TYPE, TasksDto.class);
    }

    public AcceptedRequestDto<String> createConversion(final VirtualMachineTemplateDto template,
            final String targetFormat) {
        ConversionDto conversion = new ConversionDto();
        conversion.setTargetFormat(targetFormat);

        return client.put(String.format("%s/conversions/%s", Links.editOrSelf(template).getHref(), targetFormat),
                AcceptedRequestDto.MEDIA_TYPE, ConversionDto.MEDIA_TYPE, conversion,
                new TypeToken<AcceptedRequestDto<String>>() {
                    private static final long serialVersionUID = -6348281615419377868L;
                });
    }

    public AcceptedRequestDto<String> restartConversion(final ConversionDto conversion) {

        return client.put(Links.editOrSelf(conversion).getHref(), AcceptedRequestDto.MEDIA_TYPE,
                ConversionDto.MEDIA_TYPE, conversion, new TypeToken<AcceptedRequestDto<String>>() {
                    private static final long serialVersionUID = -6348281615419377868L;
                });
    }

    public TemplateDefinitionListDto createTemplateDefinitionList(final EnterpriseDto enterprise,
            final String urlRepo) {
        return client.post(
                String.format("%s/%s/appslib/templateDefinitionLists", ENTERPRISES_URL, enterprise.getId()),
                TemplateDefinitionListDto.MEDIA_TYPE, MediaType.TEXT_PLAIN, urlRepo,
                TemplateDefinitionListDto.class);
    }

    public VirtualMachineTemplateDto downloadTemplateToRepository(final DatacenterRepositoryDto repository,
            final TemplateDefinitionDto templateDefinition, final int polling, final int timeout,
            final TimeUnit time) {
        VirtualMachineTemplateRequestDto templateDefinitionReq = new VirtualMachineTemplateRequestDto();
        templateDefinitionReq.addLink(Links.withRel("templateDefinition", templateDefinition.getEditLink()));

        AcceptedRequestDto<String> acceptedDto = client.post(
                repository.searchLink("virtualmachinetemplates").getHref(), AcceptedRequestDto.MEDIA_TYPE,
                VirtualMachineTemplateRequestDto.MEDIA_TYPE, templateDefinitionReq,

                new TypeToken<AcceptedRequestDto<String>>() {
                    private static final long serialVersionUID = -6348281615419377868L;
                });

        TaskDto task = client.waitForTask(acceptedDto, polling, timeout, time);
        if (FINISHED_SUCCESSFULLY != task.getState()) {
            throw new RuntimeException("Download template operation failed");
        }

        return client.get(task.searchLink("result"), VirtualMachineTemplateDto.class);
    }

    public ConversionDto getConversion(final VirtualMachineTemplateDto vmt, final String diskFormatType) {
        return client.get(String.format("%s/%s", vmt.searchLink("conversions").getHref(), diskFormatType),
                ConversionDto.MEDIA_TYPE, ConversionDto.class);
    }

    public Iterable<TaskDto> listConversionTasks(final ConversionDto conversion) {
        return client.list(conversion.searchLink("tasks"), TasksDto.class);
    }

    public Iterable<ConversionDto> listConversions(final VirtualMachineTemplateDto vmt) {
        return client.list(vmt.searchLink("conversions").getHref(), ConversionsDto.MEDIA_TYPE,
                ConversionsDto.class);
    }

    public VirtualMachineTemplateDto waitWhileInProgress(final VirtualMachineTemplateDto vmt,
            final int pollInterval, final int maxWait, final TimeUnit timeUnit) {
        Stopwatch watch = Stopwatch.createStarted();
        while (watch.elapsed(timeUnit) < maxWait) {
            VirtualMachineTemplateDto refreshed = client.refresh(vmt);
            if (!VMTemplateState.IN_PROGRESS.equals(refreshed.getState())) {
                return refreshed;
            }

            Uninterruptibles.sleepUninterruptibly(pollInterval, timeUnit);
        }

        throw new RuntimeException(
                "Virtual machine template did not reach the desired state in the configured timeout");
    }
}