2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.sample.toaster.provider;
10 import java.util.Collections;
11 import java.util.concurrent.Callable;
12 import java.util.concurrent.ExecutionException;
13 import java.util.concurrent.ExecutorService;
14 import java.util.concurrent.Executors;
15 import java.util.concurrent.Future;
16 import java.util.concurrent.atomic.AtomicLong;
18 import org.opendaylight.controller.config.yang.config.toaster_provider.impl.ToasterProviderRuntimeMXBean;
19 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
20 import org.opendaylight.controller.sal.binding.api.data.DataBrokerService;
21 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
22 import org.opendaylight.controller.sal.common.util.Rpcs;
23 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.DisplayString;
24 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.MakeToastInput;
25 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.ToastDone.ToastStatus;
26 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.ToastDoneBuilder;
27 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.Toaster;
28 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.Toaster.ToasterStatus;
29 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.ToasterBuilder;
30 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.ToasterData;
31 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.ToasterService;
32 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
33 import org.opendaylight.yangtools.yang.common.RpcError;
34 import org.opendaylight.yangtools.yang.common.RpcResult;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
38 import com.google.common.util.concurrent.Futures;
40 public class OpendaylightToaster implements ToasterData, ToasterService, ToasterProviderRuntimeMXBean, AutoCloseable {
42 private static final Logger log = LoggerFactory.getLogger(OpendaylightToaster.class);
43 private static final InstanceIdentifier<Toaster> toasterIID = InstanceIdentifier.builder(Toaster.class).build();
45 private static final DisplayString toasterManufacturer = new DisplayString("Opendaylight");
46 private static final DisplayString toasterModelNumber = new DisplayString("Model 1 - Binding Aware");
48 private NotificationProviderService notificationProvider;
49 private DataBrokerService dataProvider;
50 private final ExecutorService executor;
52 private Future<RpcResult<Void>> currentTask;
54 public OpendaylightToaster() {
55 executor = Executors.newFixedThreadPool(1);
59 public synchronized Toaster getToaster() {
60 ToasterBuilder tb = new ToasterBuilder();
62 .setToasterManufacturer(toasterManufacturer) //
63 .setToasterModelNumber(toasterModelNumber) //
64 .setToasterStatus(currentTask == null ? ToasterStatus.Up : ToasterStatus.Down);
70 public synchronized Future<RpcResult<Void>> cancelToast() {
71 if (currentTask != null) {
78 public synchronized Future<RpcResult<Void>> makeToast(MakeToastInput input) {
79 log.debug("makeToast - Received input for toast");
81 if (currentTask != null) {
82 return inProgressError();
84 currentTask = executor.submit(new MakeToastTask(input));
89 private Future<RpcResult<Void>> inProgressError() {
90 RpcResult<Void> result = Rpcs.<Void> getRpcResult(false, null, Collections.<RpcError> emptySet());
91 return Futures.immediateFuture(result);
94 private void cancelToastImpl() {
95 currentTask.cancel(true);
96 ToastDoneBuilder toastDone = new ToastDoneBuilder();
97 toastDone.setToastStatus(ToastStatus.Cancelled);
98 notificationProvider.publish(toastDone.build());
101 public void setNotificationProvider(NotificationProviderService salService) {
102 this.notificationProvider = salService;
105 public void setDataProvider(DataBrokerService salDataProvider) {
106 this.dataProvider = salDataProvider;
110 private void logToastInput(MakeToastInput input) {
111 String toastType = input.getToasterToastType().getName();
112 String toastDoneness = input.getToasterDoneness().toString();
113 log.trace("Toast: {} doneness: {}", toastType, toastDoneness);
116 private final AtomicLong toastsMade = new AtomicLong(0);
119 public Long getToastsMade() {
120 return toastsMade.get();
123 private void updateStatus() {
124 if (dataProvider != null) {
125 final DataModificationTransaction t = dataProvider.beginTransaction();
126 t.removeOperationalData(toasterIID);
127 t.putOperationalData(toasterIID, getToaster());
131 } catch (InterruptedException | ExecutionException e) {
132 log.warn("Failed to update toaster status, operational otherwise", e);
135 log.trace("No data provider configured, not updating status");
140 public void close() throws ExecutionException, InterruptedException {
141 if (dataProvider != null) {
142 final DataModificationTransaction t = dataProvider.beginTransaction();
143 t.removeOperationalData(toasterIID);
148 private class MakeToastTask implements Callable<RpcResult<Void>> {
150 final MakeToastInput toastRequest;
152 public MakeToastTask(MakeToastInput toast) {
153 toastRequest = toast;
157 public RpcResult<Void> call() throws InterruptedException {
158 Thread.sleep(1000 * toastRequest.getToasterDoneness());
160 ToastDoneBuilder notifyBuilder = new ToastDoneBuilder();
161 notifyBuilder.setToastStatus(ToastStatus.Done);
162 notificationProvider.publish(notifyBuilder.build());
163 log.debug("Toast Done");
164 logToastInput(toastRequest);
167 toastsMade.incrementAndGet();
170 return Rpcs.<Void> getRpcResult(true, null, Collections.<RpcError> emptySet());