| /* |
| * Copyright 2017-present Open Networking Laboratory |
| * |
| * 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 org.onosproject.net.intent.impl.installer; |
| |
| import org.apache.felix.scr.annotations.Activate; |
| import org.apache.felix.scr.annotations.Component; |
| import org.apache.felix.scr.annotations.Deactivate; |
| import org.apache.felix.scr.annotations.Reference; |
| import org.apache.felix.scr.annotations.ReferenceCardinality; |
| import org.onosproject.net.domain.DomainIntent; |
| import org.onosproject.net.domain.DomainIntentOperations; |
| import org.onosproject.net.domain.DomainIntentOperationsContext; |
| import org.onosproject.net.domain.DomainIntentService; |
| import org.onosproject.net.intent.IntentData; |
| import org.onosproject.net.intent.IntentExtensionService; |
| import org.onosproject.net.intent.IntentInstallCoordinator; |
| import org.onosproject.net.intent.IntentInstaller; |
| import org.onosproject.net.intent.IntentOperationContext; |
| import org.onosproject.net.intent.impl.IntentManager; |
| import org.onosproject.net.intent.impl.ObjectiveTrackerService; |
| import org.slf4j.Logger; |
| |
| import java.util.List; |
| import java.util.Optional; |
| |
| import static org.slf4j.LoggerFactory.getLogger; |
| |
| /** |
| * Installer for domain Intent. |
| */ |
| @Component(immediate = true) |
| public class DomainIntentInstaller implements IntentInstaller<DomainIntent> { |
| |
| private final Logger log = getLogger(IntentManager.class); |
| |
| @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| protected IntentExtensionService intentExtensionService; |
| |
| @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| protected ObjectiveTrackerService trackerService; |
| |
| @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| protected IntentInstallCoordinator intentInstallCoordinator; |
| |
| @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| protected DomainIntentService domainIntentService; |
| |
| @Activate |
| public void activated() { |
| intentExtensionService.registerInstaller(DomainIntent.class, this); |
| } |
| |
| @Deactivate |
| public void deactivated() { |
| intentExtensionService.unregisterInstaller(DomainIntent.class); |
| } |
| |
| @Override |
| public void apply(IntentOperationContext<DomainIntent> context) { |
| Optional<IntentData> toUninstall = context.toUninstall(); |
| Optional<IntentData> toInstall = context.toInstall(); |
| |
| List<DomainIntent> uninstallIntents = context.intentsToUninstall(); |
| List<DomainIntent> installIntents = context.intentsToInstall(); |
| |
| if (!toInstall.isPresent() && !toUninstall.isPresent()) { |
| intentInstallCoordinator.intentInstallSuccess(context); |
| return; |
| } |
| |
| if (toUninstall.isPresent()) { |
| IntentData intentData = toUninstall.get(); |
| trackerService.removeTrackedResources(intentData.key(), intentData.intent().resources()); |
| uninstallIntents.forEach(installable -> |
| trackerService.removeTrackedResources(intentData.intent().key(), |
| installable.resources())); |
| } |
| |
| if (toInstall.isPresent()) { |
| IntentData intentData = toInstall.get(); |
| trackerService.addTrackedResources(intentData.key(), intentData.intent().resources()); |
| installIntents.forEach(installable -> |
| trackerService.addTrackedResources(intentData.key(), |
| installable.resources())); |
| } |
| |
| // Generate domain Intent operations |
| DomainIntentOperations.Builder builder = DomainIntentOperations.builder(); |
| DomainIntentOperationsContext domainOperationsContext; |
| |
| uninstallIntents.forEach(builder::remove); |
| installIntents.forEach(builder::add); |
| |
| domainOperationsContext = new DomainIntentOperationsContext() { |
| @Override |
| public void onSuccess(DomainIntentOperations idops) { |
| intentInstallCoordinator.intentInstallSuccess(context); |
| } |
| |
| @Override |
| public void onError(DomainIntentOperations idos) { |
| intentInstallCoordinator.intentInstallFailed(context); |
| } |
| }; |
| log.debug("submitting domain intent {} -> {}", |
| toUninstall.map(x -> x.key().toString()).orElse("<empty>"), |
| toInstall.map(x -> x.key().toString()).orElse("<empty>")); |
| |
| // Submit domain Inten operations with domain context |
| domainIntentService.sumbit(builder.build(domainOperationsContext)); |
| } |
| } |