All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.solidfire.adaptor.ScheduleAdaptor Maven / Gradle / Ivy

The newest version!
/*
 * Copyright © 2014-2016 NetApp, Inc. All Rights Reserved.
 *
 * 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.solidfire.adaptor;

import com.solidfire.core.javautil.Optional;
import com.solidfire.element.api.*;
import com.solidfire.element.apiactual.*;
import com.solidfire.core.client.ApiException;

import java.util.*;


/**
 * Created by Jason Ryan Womack on 8/11/16.
 */
public class ScheduleAdaptor {

    public static final String TIME_INTERVAL = "Time Interval";
    public static final String DAYS_OF_MONTH = "Days Of Month";
    public static final String DAYS_OF_WEEK = "Days Of Week";
    public static final String FREQUENCY = "frequency";

    /**
     * This adaptor modifies the ApiSchedule object returned by the GetSchedule API call into a Simple Schedule
     * object using the Frequency classes that delineate different types of scheduling frequencies.
     *
     * @param sfe     An instance of SolidFireElement
     * @param request The original request object.
     * @return a GetScheduleResult with the modified simple schedule object
     * @see com.solidfire.element.api.Frequency
     */
    public static GetScheduleResult getSchedule(SolidFireElement sfe, GetScheduleRequest request) {
        final ApiGetScheduleResult result = sfe.sendRequest("GetSchedule", request, GetScheduleRequest.class, ApiGetScheduleResult.class);

        return new GetScheduleResult(toSchedule(result.getSchedule()));
    }

    /**
     * This adaptor modifies the ApiSchedule object returned by the ListSchedules API call into a Simple Schedule
     * object using the Frequency classes that delineate different types of scheduling frequencies.
     *
     * @param sfe     An instance of SolidFireElement
     * @return a ListScheduleResult with the modified simple schedule objects
     */
    public static ListSchedulesResult listSchedules(SolidFireElement sfe) {
        final ApiListSchedulesResult result = sfe.sendRequest("ListSchedules", null, null, ApiListSchedulesResult.class);

        final List schedules = new ArrayList<>();
        for (final ApiSchedule apiSchedule : result.getSchedules()) {
            schedules.add(toSchedule(apiSchedule));
        }

        return new ListSchedulesResult(schedules.toArray(new Schedule[schedules.size()]));
    }

    /**
     * This adaptor modifies the Simple Schedule object, which uses the Frequency classes that delineate different types
     * of scheduling frequencies, into an ApiSchedule object. This API object is passed into the CreateSchedule API call.
     *
     * @param sfe     An instance of SolidFireElement
     * @param request The original request object.
     * @return a CreateScheduleResult
     */
    public static CreateScheduleResult createSchedule(SolidFireElement sfe, CreateScheduleRequest request) {
        if (request == null || request.getSchedule() == null) {
            throw new ApiException("Invalid Request. Request or Schedule is null or missing.");

        }
        if (request.getSchedule().getScheduleID() != null && request.getSchedule().getScheduleID().isPresent()) {
            throw new ApiException("ScheduleID should not be present. Do not specify ScheduleID when creating a Schedule. One will be assigned upon creation.");
        }

        if (request.getSchedule().getFrequency() == null) {
            throw new ApiException("Frequency is not present. Make sure the schedule object has a value in the frequency property before attempting to create a Schedule.");
        }

        if (request.getSchedule().getScheduleInfo() == null) {
            throw new ApiException("Schedule_info is not present. Make sure the schedule object has a value in the schedule_info property before attempting to modify a Schedule.");
        }

        final ApiSchedule apiSchedule = toApiSchedule(request.getSchedule());
        final ApiCreateScheduleRequest.Builder apiRequest = ApiCreateScheduleRequest.builder()
                                                                                    .optionalHours(apiSchedule.getHours())
                                                                                    .optionalMinutes(apiSchedule.getMinutes())
                                                                                    .optionalMonthdays(apiSchedule.getMonthdays())
                                                                                    .optionalPaused(apiSchedule.getPaused())
                                                                                    .optionalRecurring(apiSchedule.getRecurring())
                                                                                    .scheduleInfo(apiSchedule.getScheduleInfo())
                                                                                    .scheduleName(apiSchedule.getScheduleName())
                                                                                    .scheduleType(apiSchedule.getScheduleType())
                                                                                    .optionalStartingDate(apiSchedule.getStartingDate())
                                                                                    .optionalWeekdays(apiSchedule.getWeekdays())
                                                                                    .attributes(apiSchedule.getAttributes());

        return sfe.sendRequest("CreateSchedule", apiRequest.build(), ApiCreateScheduleRequest.class, CreateScheduleResult.class);

    }

    /**
     * This adaptor modifies the Simple Schedule object, which uses the Frequency classes that delineate different types
     * of scheduling frequencies, into an ApiSchedule object. This API object is passed into the CreateSchedule API call.
     * The result of the API call is then transformed back into a Simple Schedule object.
     *
     * @param sfe     An instance of SolidFireElement
     * @param request The original request object.
     * @return a ModifyScheduleResult with the modified simple schedule objects
     */
    public static ModifyScheduleResult modifySchedule(SolidFireElement sfe, ModifyScheduleRequest request) {
        if (request == null || request.getSchedule() == null) {
            throw new ApiException("Invalid Request. Request or Schedule is null or missing.");
        }
        if (!request.getSchedule().getScheduleID().isPresent()) {
            throw new ApiException("ScheduleID is missing. Cannot modify a schedule without a ScheduleID");
        }

        if (request.getSchedule().getFrequency() == null) {
            throw new ApiException("Frequency is not present. Make sure the schedule object has a value in the frequency property before attempting to create a Schedule.");
        }

        if (request.getSchedule().getScheduleInfo() == null) {
            throw new ApiException("Schedule_info is not present. Make sure the schedule object has a value in the schedule_info property before attempting to modify a Schedule.");
        }

        final ApiSchedule apiSchedule = toApiSchedule(request.getSchedule());

        final ApiModifyScheduleRequest.Builder apiRequest = ApiModifyScheduleRequest.builder()
                                                                                    .optionalRunNextInterval(apiSchedule.getRunNextInterval())
                                                                                    .scheduleID(apiSchedule.getScheduleID())
                                                                                    .optionalToBeDeleted(apiSchedule.getToBeDeleted())
                                                                                    .optionalAttributes(apiSchedule.getAttributes())
                                                                                    .optionalHours(apiSchedule.getHours())
                                                                                    .optionalMinutes(apiSchedule.getMinutes())
                                                                                    .optionalMonthdays(apiSchedule.getMonthdays())
                                                                                    .optionalPaused(apiSchedule.getPaused())
                                                                                    .optionalRecurring(apiSchedule.getRecurring())
                                                                                    .optionalScheduleInfo(apiSchedule.getScheduleInfo())
                                                                                    .optionalScheduleName(apiSchedule.getScheduleName())
                                                                                    .optionalScheduleType(apiSchedule.getScheduleType())
                                                                                    .optionalStartingDate(apiSchedule.getStartingDate())
                                                                                    .optionalWeekdays(apiSchedule.getWeekdays());

       ApiModifyScheduleResult result = sfe.sendRequest("ModifySchedule", apiRequest.build(), ApiModifyScheduleRequest.class, ApiModifyScheduleResult.class);

       if (result.getSchedule() != null) {
           return new ModifyScheduleResult(Optional.of(toSchedule(result.getSchedule())));
       } else {
           return new ModifyScheduleResult();
       }

    }

    /**
     * Converts an ApiSchedule object into a Schedule object
     *
     * @param api the ApiSchedule object to be converted
     *
     * @return a Schedule object
    */
    public static Schedule toSchedule(final ApiSchedule api) {
        final Schedule.Builder schedule = Schedule.builder();

        schedule.optionalHasError(api.getHasError())
                .optionalLastRunStatus(api.getLastRunStatus())
                .optionalLastRunTimeStarted(api.getLastRunTimeStarted())
                .name(api.getScheduleName())
                .optionalPaused(api.getPaused())
                .optionalRecurring(api.getRecurring())
                .optionalRunNextInterval(api.getRunNextInterval())
                .optionalScheduleID(api.getScheduleID())
                .optionalStartingDate(api.getStartingDate())
                .optionalToBeDeleted(api.getToBeDeleted())
                .scheduleInfo(toScheduleInfo(api.getScheduleInfo()));

        if (api.getAttributes() != null && api.getAttributes().containsKey(FREQUENCY)) {
            switch (api.getAttributes().get(FREQUENCY).toString()) {
                case TIME_INTERVAL:
                    schedule.frequency(TimeIntervalFrequency.builder()
                                                            .days(api.getHours() == null ? 0L : api.getHours() / 24)
                                                            .hours(api.getHours() == null ? 0L : api.getHours() % 24)
                                                            .minutes(api.getMinutes())
                                                            .build());
                    break;
                case DAYS_OF_MONTH:
                    schedule.frequency(DaysOfMonthFrequency.builder()
                                                           .hours(api.getHours())
                                                           .minutes(api.getMinutes())
                                                           .monthdays(api.getMonthdays())
                                                           .build());
                    break;
                case DAYS_OF_WEEK:
                    schedule.frequency(DaysOfWeekFrequency.builder()
                                                          .hours(api.getHours())
                                                          .minutes(api.getMinutes())
                                                          .weekdays(toWeekdays(api.getWeekdays()))
                                                          .build());
                    break;
            }
        }
        return schedule.build();
    }

    private static ScheduleInfo toScheduleInfo(final ApiScheduleInfo api) {
        final ScheduleInfo.Builder info = ScheduleInfo.builder();

        info.optionalEnableRemoteReplication(api.getEnableRemoteReplication() == null ? null : api.getEnableRemoteReplication().orElse(null));
        info.optionalSnapshotName(api.getName() == null ? null : api.getName().orElse(null));
        info.optionalRetention(api.getRetention() == null ? null : api.getRetention().orElse(null));

        final Set volumeIDs = new HashSet<>();
        if (api.getVolumeID() != null && api.getVolumeID().isPresent()) {
            volumeIDs.add(api.getVolumeID().get());
        }
        if (api.getVolumes() != null && api.getVolumes().isPresent()) {
            volumeIDs.addAll(Arrays.asList(api.getVolumes().get()));
        }

        info.optionalVolumeIDs(volumeIDs.toArray(new Long[volumeIDs.size()]));

        return info.build();
    }

    private static Weekday[] toWeekdays(final ApiWeekday[] api) {
        final List weekdays = new ArrayList<>();
        for (final ApiWeekday apiDay : api) {
            weekdays.add(Weekday.fromOrdinal(apiDay.getDay()));
        }
        return weekdays.toArray(new Weekday[api.length]);
    }

    /**
     * Converts a Schedule object into an ApiSchedule object
     *
     * @param schedule the Schedule object to be converted
     *
     * @return an ApiSchedule object
     */
    public static ApiSchedule toApiSchedule(final Schedule schedule) {
        final ApiSchedule.Builder api = ApiSchedule.builder();

        api.hasError(schedule.getHasError().orElse(null));
        api.scheduleName(schedule.getName());
        api.paused(schedule.getPaused().orElse(null));
        api.recurring(schedule.getRecurring().orElse(null));
        api.runNextInterval(schedule.getRunNextInterval().orElse(null));
        api.scheduleID(schedule.getScheduleID().orElse(null));
        api.startingDate(schedule.getStartingDate().orElse(null));
        api.toBeDeleted(schedule.getToBeDeleted().orElse(null));
        api.scheduleType("Snapshot");
        api.attributes(new HashMap());


        api.scheduleInfo(toApiScheduleInfo(schedule.getScheduleInfo()));

        if (schedule.getFrequency() == null) {
            throw new ApiException("Invalid schedule - no frequency set");
        } else if (schedule.getFrequency().getClass().equals(TimeIntervalFrequency.class)) {

            final TimeIntervalFrequency frequency = (TimeIntervalFrequency) schedule.getFrequency();

            final Map attributes = new HashMap<>();

            attributes.put(FREQUENCY, TIME_INTERVAL);
            api.attributes(attributes);

            final long minutes = frequency.getMinutes() == null ? 0L : frequency.getMinutes();
            final long hours = frequency.getHours() == null ? 0L : frequency.getHours();
            final long days = frequency.getDays() == null ? 0L : frequency.getDays();

            api.minutes(minutes);
            api.hours(days * 24 + hours);

        } else if (schedule.getFrequency().getClass().equals(DaysOfMonthFrequency.class)) {

            final DaysOfMonthFrequency frequency = (DaysOfMonthFrequency) schedule.getFrequency();

            final Map attributes = new HashMap<>();

            attributes.put(FREQUENCY, DAYS_OF_MONTH);
            api.attributes(attributes);
            api.minutes(frequency.getMinutes());
            api.hours(frequency.getHours());
            api.monthdays(frequency.getMonthdays());

        } else if (schedule.getFrequency().getClass().equals(DaysOfWeekFrequency.class)) {

            final DaysOfWeekFrequency frequency = (DaysOfWeekFrequency) schedule.getFrequency();

            final Map attributes = new HashMap<>();

            attributes.put(FREQUENCY, DAYS_OF_WEEK);
            api.attributes(attributes);
            api.minutes(frequency.getMinutes());
            api.hours(frequency.getHours());

            final List apiWeekdays = new ArrayList<>();

            for (final Weekday weekday : frequency.getWeekdays()) {
                apiWeekdays.add(new ApiWeekday((long) weekday.ordinal(), 1L));
            }

            api.weekdays(apiWeekdays.toArray(new ApiWeekday[apiWeekdays.size()]));
        }

        return api.build();
    }

    private static ApiScheduleInfo toApiScheduleInfo(final ScheduleInfo scheduleInfo) {
        final ApiScheduleInfo.Builder api = ApiScheduleInfo.builder();

        final ScheduleInfo info = (scheduleInfo == null) ? ScheduleInfo.builder().build() : scheduleInfo;

        api.optionalEnableRemoteReplication(info.getEnableRemoteReplication() == null ? null : info.getEnableRemoteReplication().orElse(null));
        api.optionalName(info.getSnapshotName() == null ? null : info.getSnapshotName().orElse(null));
        api.optionalRetention(info.getRetention() == null ? null : info.getRetention().orElse(null));


        if (!info.getVolumeIDs().isPresent() || info.getVolumeIDs().get().length == 0) {
            throw new ApiException("ScheduleInfo.VolumeIDs are missing. Cannot create or modify a schedule without at least one VolumeID.");
        } else if (info.getVolumeIDs().get().length == 1) {
            api.optionalVolumeID(info.getVolumeIDs().get()[0]);
        } else {
            api.optionalVolumes(info.getVolumeIDs().get());
        }

        return api.build();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy