SlideShare a Scribd company logo
1 of 44
NUBOMEDIA Webinar
October 2016
boni.garcia@urjc.es
Table of contents
1. Introduction
2. NUBOMEDIA development
3. NUBOMEDIA PaaS
4. Let's get to work
5. Summary
Table of contents
1. Introduction
āˆ’ Review
āˆ’ What is NUBOMEDIA?
āˆ’ References
1. NUBOMEDIA development
2. NUBOMEDIA PaaS
3. Let's get to work
4. Summary
1. Introduction
Review
āˆ’Kurento is a media server and a set of APIs
aimed to create applications with advance media
capabilities
āˆ’The building blocks for applications are named
media elements, chained into media pipelines
1. Introduction
What is NUBOMEDIA?
āˆ’NUBOMEDIA is an open source PaaS
(Platform as a Service) based on Kurento
āˆ’NUBOMEDIA exposes to developers the
ability of deploying and leveraging
applications with media capabilities
1. Introduction
References
āˆ’Home page
http://www.nubomedia.eu/
āˆ’Developers guide
http://nubomedia.readthedocs.io/
āˆ’GitHub organization
https://github.com/nubomedia/
āˆ’Support for developers
https://groups.google.com/forum/#!forum/nubomedia-dev
Table of contents
1. Introduction
2. NUBOMEDIA development
āˆ’ Architecture
āˆ’ Media API
āˆ’ Kurento vs NUBOMEDIA apps
1. NUBOMEDIA PaaS
2. Let's get to work
3. Summary
2. NUBOMEDIA development
Architecture
āˆ’The Architecture in NUBOMEDIA is the same
than in Kurento
ā€¢ Three-tier model (inspired in the Web)
Client
Application
Server
Media Server
NUBOMEDIA PaaS
2. NUBOMEDIA development
Architecture
āˆ’Like every application with media capabilities, it is
important to distinguish between the media and
signaling plane
Client
Application
Server
Media Server
NUBOMEDIA PaaS
signaling
media
2. NUBOMEDIA development
Media API
āˆ’Kurento Media API allows to Java developers
consume the media services provided by Kurento
Media Server (KMS)
āˆ’Concepts:
ā€¢ Media Element
ā€¢ Media Pipeline
2. NUBOMEDIA development
Media API
āˆ’KMS instances are provided elastically by NUBOMEDIA
ā€¢ The number of available KMS instances depends on the PaaS
Manager configuration
āˆ’Each KMS has a total amount of available points to create
Media Pipelines and Media Elements
ā€¢ The total points depends on the number of VCPUs of the KMS
ā€¢ The type of the instance can be selected on the PaaS Manager
configuration
Instance type # VCPUs KMS points
Medium 2 200
Large 4 400
2. NUBOMEDIA development
Kurento vs NUBOMEDIA apps
1.Maven dependencies <dependency>
<groupId>org.kurento</groupId>
<artifactId>kurento-client</artifactId>
</dependency>
<dependency>
<groupId>de.fhg.fokus.nubomedia</groupId>
<artifactId>nubomedia-media-client</artifactId>
</dependency>
<dependency>
<groupId>org.kurento</groupId>
<artifactId>kurento-client</artifactId>
</dependency>
In Kurento apps, we need the
kurento-client library to handle
KMS from the Java logic
In NUBOMEDIA apps, we need to
include also the nubomedia-
media-client to discover KMSs
within the NUBOMEDIA PaaS
2. NUBOMEDIA development
Kurento vs NUBOMEDIA apps
2.Instance of KurentoClient
int sessionPoints = 25; // Chose a convenient value
for your pipeline
Properties properties = new Properties();
properties.add("loadPoints", sessionPoints);
KurentoClient kurentoClient =
KurentoClient.create(properties);
@Bean
public KurentoClient kurentoClient() {
return KurentoClient.create();
}
@Autowired
private KurentoClient kurento;
In Kurento, KMS is controlled by an
single instance of KurentoClient
(for example a Spring Bean)
In NUBOMEDIA, each new media
session should create an instance of
KurentoClient. The points
mechanism is used to locate or create
KMS instances (scaling in/out)
2. NUBOMEDIA development
Kurento vs NUBOMEDIA apps
3.Deployment: Dockerfile
In Kurento, no Dokerfile is
required (deployment is managed
by hand)
In NUBOMEDIA, a Dokerfile
file is required
FROM nubomedia/apps-baseimage:src
MAINTAINER Nubomedia
ADD . /home/nubomedia
ENTRYPOINT cd /home/nubomedia && mvn spring-
boot:run
Table of contents
1. Introduction
2. NUBOMEDIA development
3. NUBOMEDIA PaaS
āˆ’ Introduction
āˆ’ PaaS GUI
1. Let's get to work
2. Summary
3. NUBOMEDIA PaaS
Introduction
āˆ’The NUBOMEDIA PaaS manager is a tool aimed to
control the way in which the NUBOMEDIA applications are
built and deployed inside the NUBOMEDIA PaaS
āˆ’The capabilities provided by the Paas Manager can be
used by developers using the PaaS GUI:
ā€¢ The PaaS Manager GUI is a web application that allows to use
the NUBOMEDIA PaaS Manager
3. NUBOMEDIA PaaS
Introduction
āˆ’Internally, the NUBOMEDIA PaaS uses Docker
containers to deploy applications
āˆ’Therefore it is a requirement to include a Dockerfile in
GitHub repository to be deployed on NUBOMEDIA
āˆ’Example:
FROM nubomedia/apps-baseimage:src
MAINTAINER Nubomedia
ADD . /home/nubomedia
ENTRYPOINT cd /home/nubomedia && mvn spring-boot:run
https://docs.docker.com/engine/reference/builder/
PaaS GUI
āˆ’Web application to manage NUBOMEDIA applications
3. NUBOMEDIA PaaS
http://paas-manager.nubomedia.eu:8081/
Credentials
needed to login
3. NUBOMEDIA PaaS
PaaS GUI
āˆ’A NUBOMEDIA application can be deployed using the
PaaS GUI
āˆ’It is done providing the GitHub repository URL and a set
of configuration parameters
PaaS GUI
āˆ’Most important configuration values:
3. NUBOMEDIA PaaS
KMS host type:
-Medium = 2 VCPUs (200 points)
-Large = 4 VCPUs (400 points)
Number of
KMSs
GitHub URL repository
Table of contents
1. Introduction
2. NUBOMEDIA development
3. NUBOMEDIA PaaS
4. Let's get to work
āˆ’ Introduction
āˆ’ Server-side
āˆ’ Client-side
āˆ’ Deployment
1. Summary
4. Let's get to work
Introduction
āˆ’Devil is in the details, and so, we are going to see a
complete NUBOMEDIA step by step
āˆ’This application is the nubomedia-magic-mirror tutorial
https://github.com/nubomedia/nubomedia-magic-mirror/
http://nubomedia.readthedocs.io/en/latest/tutorial/nubomedia-magic-mirror/
4. Let's get to work
Server-side
āˆ’We recommend Spring-Boot as the base technology for
NUBOMEDIA applications
ā€¢ Spring-Boot embeds a Tomcat server in a simple seamless way
for developers
ā€¢ The application is packaged as a runnable JAR, and when this
JAR is executed, the Tomcat server is started and the web
application automatically deployed
āˆ’We recommend Maven as for managing the life-cycle and
managing the dependencies of our applications
4. Let's get to work
Server-side
āˆ’The first step is to clone GitHub repository
āˆ’We recommend use an IDE to develop applications. For
example, Eclipse (importing app as Maven project)
git clone https://github.com/nubomedia/nubomedia-magic-mirror
4. Let's get to work
Server-side
āˆ’First step is understand the pom.xml file:
<parent>
<groupId>org.kurento</groupId>
<artifactId>kurento-parent-pom</artifactId>
<version>6.6.0</version>
</parent>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-
plugin</artifactId>
</plugin>
</plugins>
Inherit from kurento-parent-pom
makes simpler our pom.xml by
reusing versions defined in the parent
We can use the spring-boot
Maven plugin to simplify the
packaging as executable JAR
4. Let's get to work
Server-side
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
</dependency>
<!-- Kurento -->
<dependency>
<groupId>org.kurento</groupId>
<artifactId>kurento-client</artifactId>
</dependency>
<dependency>
<groupId>org.kurento</groupId>
<artifactId>kurento-utils-js</artifactId>
</dependency>
<!-- Nubomedia -->
<dependency>
<groupId>de.fhg.fokus.nubomedia</groupId>
<artifactId>nubomedia-media-client</artifactId>
<version>${nubomedia-media-
client.version}</version>
</dependency>
ā€¦
ā€¦
Dependencies clause is one of
the most important. Notice that
our app depends on Spring,
Kurento, NUBOMEDIA and
WebJars (for the client-side)
ā€¦
4. Let's get to work
Server-side
āˆ’We need to define also the way
in which signaling is going to
work in our application
āˆ’For the shake of simplicity, we
use a raw WebSocket between
the server and client side
āˆ’We need to define the messages
exchanged to carry out the
communication about client and
server
clientserver
start
startResponse
iceCandidate
onIceCandidate
stop
error
notEnoughResources
Starts a media
session
ICE candidates
(WebRTC
negotiation)
Stops a media
session
Error cases
4. Let's get to work
Server-side
āˆ’The class diagram of our application is the following:
MagicMirrorApp
MagicMirrorHandler
UserSession
Main class
Message handler
(signaling)
User session
(session id,
media logic)
4. Let's get to work
Server-side
@SpringBootApplication
@EnableWebSocket
public class MagicMirrorApp implements WebSocketConfigurer {
@Bean
public MagicMirrorHandler handler() {
return new MagicMirrorHandler();
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(handler(), "/magicmirror");
}
public static void main(String[] args) throws Exception {
new SpringApplication(MagicMirrorApp.class).run(args);
}
}
MagicMirrorApp defines the
Spring-Boot application and
the WebSocket used for
signaling ("/magicmirror",
managed by
MagicMirrorHandler)
4. Let's get to work
Server-side
public class MagicMirrorHandler extends TextWebSocketHandler {
private final ConcurrentHashMap<String, UserSession> users = new ConcurrentHashMap<>();
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
JsonObject jsonMessage = new GsonBuilder().create().fromJson(message.getPayload(),
JsonObject.class);
switch (jsonMessage.get("id").getAsString()) {
case "start":
start(session, jsonMessage);
break;
case "stop":
release(session);
break;
case "onIceCandidate":
onIceCandidate(session, jsonMessage);
break;
default:
error(session, "Invalid message with id " + jsonMessage.get("id").getAsString());
break;
}
}
MagicMirrorHandler
manages signaling
messages. It keeps a
collection of user sessions
(thread-safe map users)
4. Let's get to work
Server-side
public class UserSession {
public String startSession(final WebSocketSession session, String sdpOffer) {
// One KurentoClient instance per session (reserving points per session)
Properties properties = new Properties();
properties.add("loadPoints", POINTS_PER_SESSION);
kurentoClient = KurentoClient.create(properties);
// Media logic (pipeline and media elements connectivity)
mediaPipeline = kurentoClient.createMediaPipeline();
webRtcEndpoint = new WebRtcEndpoint.Builder(mediaPipeline).build();
FaceOverlayFilter faceOverlayFilter = new FaceOverlayFilter.Builder(mediaPipeline).build();
faceOverlayFilter.setOverlayedImage("http://files.kurento.org/img/mario-wings.png", -0.35F,
-1.2F, 1.6F, 1.6F);
webRtcEndpoint.connect(faceOverlayFilter);
faceOverlayFilter.connect(webRtcEndpoint);
// WebRTC negotiation
String sdpAnswer = webRtcEndpoint.processOffer(sdpOffer);
webRtcEndpoint.gatherCandidates();
return sdpAnswer;
}
UserSession
handles media logic
(media pipeline,
media elements,
WebRTC
negotiationā€¦)
4. Let's get to work
Server-side
āˆ’As of Chrome 47, access to user media can only be done
by secure apps (HTTPS), and so, it is needed a Java
keystore
server.port: 8443
server.ssl.key-store: classpath:keystore.jks
server.ssl.key-store-password: kurento
server.ssl.keyStoreType: JKS
server.ssl.keyAlias: kurento-selfsigned
application.properties
http://doc-kurento.readthedocs.io/en/stable/mastering/securing-kurento-applications.html
4. Let's get to work
Client-side <!-- WebJars -->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>webjars-locator</artifactId>
</dependency>
<dependency>
<groupId>org.webjars.bower</groupId>
<artifactId>demo-console</artifactId>
</dependency>
<dependency>
<groupId>org.webjars.bower</groupId>
<artifactId>adapter.js</artifactId>
</dependency>
<dependency>
<groupId>org.webjars.bower</groupId>
<artifactId>jquery</artifactId>
</dependency>
<dependency>
<groupId>org.webjars.bower</groupId>
<artifactId>ekko-lightbox</artifactId>
</dependency>
</dependencies>
ā€¦
Client-side dependencies are
handled by Maven
WebJars allows to declare
client-side dependencies (i.e.
CSS and JavaScript libraries)
also in the pom.xml. These
libraries are used linked in the
HTML client-side pages
4. Let's get to work
Client-side
āˆ’The app has been implemented as a SPA (single page
application) which contains a single HTML
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="webjars/bootstrap/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="webjars/ekko-lightbox/dist/ekko-lightbox.min.css">
<link rel="stylesheet" href="webjars/demo-console/index.css">
<link rel="stylesheet" href="css/styles.css">
<script src="webjars/jquery/dist/jquery.min.js"></script>
<script src="webjars/bootstrap/dist/js/bootstrap.min.js"></script>
<script src="webjars/ekko-lightbox/dist/ekko-lightbox.min.js"></script>
<script src="webjars/adapter.js/adapter.js"></script>
<script src="webjars/demo-console/index.js"></script>
<script src="js/kurento-utils.js"></script>
<script src="js/index.js"></script>
<title>NUBOMEDIA Tutorial: WebRTC Magic Mirror</title>
</head>
JavaScript/CSS are
linked here. Using
Bootstrap to provide
responsive design
4. Let's get to work
Client-side
āˆ’A JavaScript file contains the client-side logic (message
handling and WebRtcPeer use)
var ws = new WebSocket('wss://' + location.host + '/magicmirror');
ws.onmessage = function(message) {
var parsedMessage = JSON.parse(message.data);
switch (parsedMessage.id) {
case 'startResponse':
startResponse(parsedMessage);
break;
case 'error':
onError("Error message from server: " + parsedMessage.message);
stop(false);
break;
case 'iceCandidate':
webRtcPeer.addIceCandidate(parsedMessage.candidate, function(error) {
if (error) return console.error("Error adding candidate: " + error);
});
break;
// ...
}
}
4. Let's get to work
Client-side
āˆ’A JavaScript file contains the client-side logic (message
handling and WebRtcPeer use)
var webRtcPeer;
function start() {
var options = {
localVideo : videoInput,
remoteVideo : videoOutput,
onicecandidate : onIceCandidate
}
webRtcPeer = new kurentoUtils.WebRtcPeer.WebRtcPeerSendrecv(options, function(error) {
if (error) {
return console.error(error);
}
webRtcPeer.generateOffer(onOffer);
});
}
4. Let's get to work
Deployment
āˆ’We need a Dockerfile to deploy our app
FROM nubomedia/apps-baseimage:src
MAINTAINER Nubomedia
ADD . /home/nubomedia
ENTRYPOINT cd /home/nubomedia && mvn exec:java
4. Let's get to work
Deployment
āˆ’Finally we can deploy our app in the NUBOMEDIA PaaS:
4. Let's get to work
Deployment
āˆ’The app changes its state, from CREATED to RUNNING (it
takes a couple of minutes to finish):
4. Let's get to work
Deployment
āˆ’We can trace two types of logs: build and app
I0708 12:51:02.335080 1 builder.go:41] $BUILD env
var is {"kind":"Build","apiVersion":"v1","metadata":{...}
I0708 12:51:02.423366 1 source.go:96] git ls-remote
https://github.com/nubomedia/nubomedia-magic-mirror
--heads
I0708 12:51:02.423547 1 repository.go:275]
Executing git ls-remote
https://github.com/nubomedia/nubomedia-magic-mirror
--heads
I0708 12:51:04.931566 1 source.go:189] Cloning
source from https://github.com/nubomedia/nubomedia-magic-
mirror
...
Image already exists
latest: digest:
sha256:24ac51ca448edfb1582f0bffc990c95506065f0aa26d5b295d
1cb32d35ce2dfe size: 49623
I0708 12:54:31.392578 1 docker.go:99] Push
successful
4. Let's get to work
Deployment
āˆ’We can trace two types of logs: build and app
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------------------------
[INFO] Building NUBOMEDIA Java Tutorial - Magic Mirror 6.5.0
[INFO] ----------------------------------------
[INFO]
[INFO] --- exec-maven-plugin:1.4.0:java (default-cli) @
nubomedia-magic-mirror ---
`.-:////:-.`
-+shmmmmmmmmmmmmmmhs/-
`/ymmmmmmmmmmmmmmmmmmmmmmmms/`
-smmmmmmmmyo+/:----:/+ohmmmmmmmms.
-ymmmmmmy+. -+hmmmmmmy. -------`
`ommmmmd+` .+dmmmmmo +oooooo-
.hmmmmm+ `ommmmmh` +oooooo-
.dmmmmh. ``````` +oooooo- sdddddds
`dmmmmy .dhhhhhh. ```````` smmmmmmy
./+osyysymmmmy .mmmmmmm. smmmmmmy
`:sdmmmmmmmmmmmmd` .mmmmmmm. -----` +yyyyyy+
`+dmmmmmmdhyyyhdmm+ .hhhhhhh. ooooo- --------
-dmmmmmy:` `:` ooooo- .----. oooooooo`
-mmmmmy. .....` hmmmms oooooooo`
dmmmms yhd- hmmmms oooooooo`
:mmmmm` syy- /++++: ::::::::
/mmmmm
`mmmmm/ -ss: os` os` -s/ -ssssss+- .+syys+. -//. ://` .::///- -/////:. // .//`
+mmmmm: :mdm/ hm. hm. /mo :my---/mm`:md:..:dm/ /o+o` -o+o` /o:.```` :o:``.:o+ oo `o/++
smmmmh :ms:m+ ym. hm. /mo :mh+++smo ym/ :mh /o.o: `o/:o`.oo:::::. :o- /o- oo +o`.o/
/mmmh :ms :moym. hm. /mo :my:::+mh sm+ /my /o.-o./o`/o`.oo.....` :o- +o- oo /o+//+o:
`odh :ms -mmm. +my::/dm- :my///omm`.dm+::+mm- /o. +oo: /o` :o/----. :o/---/o/ oo -o:..../o.
- .+: .++` ./+++:` .++++++:` `:+oo+:` .-` `-- .-` `-----. .------` -- -- `--
...
2016-07-08 12:55:32.702 INFO 6 --- [irrorApp.main()]
s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on
port(s): 8443 (https)
2016-07-08 12:55:32.713 INFO 6 --- [irrorApp.main()]
e.n.tutorial.magicmirror.MagicMirrorApp : Started MagicMirrorApp
in 10.529 seconds (JVM running for 31.135)
Deployment
āˆ’Ta da!
4. Let's get to work
Table of contents
1. Introduction
2. NUBOMEDIA development
3. NUBOMEDIA PaaS
4. Let's get to work
5. Summary
āˆ’ Things to remember for NUBOMEDIA apps
5. Summary
Things to remember for NUBOMEDIA apps
āˆ’From a high level point of view:
ā€¢ The media-api concepts (media pipelines, media elements) are
exactly the same in NUBOMEDIA
ā€¢ The NUBOMEDIA PaaS is going to provide elastically instances
of KMSs to our application
āˆ’From a low level point of view:
1. We need to add the nubomedia-media-client dependency
2. We need to create a KurentoClient instance per media
session in order to inform the PaaS when KMSs are required
3. We need a Dockerfile to configure the execution point of our
application

More Related Content

What's hot

WebRTC and VoIP: bridging the gap (Kamailio world conference 2013)
WebRTC and VoIP: bridging the gap (Kamailio world conference 2013)WebRTC and VoIP: bridging the gap (Kamailio world conference 2013)
WebRTC and VoIP: bridging the gap (Kamailio world conference 2013)
Victor Pascual Ɓvila
Ā 
Cloud Standards: EnablingInteroperability.and.package.delivery
Cloud Standards: EnablingInteroperability.and.package.deliveryCloud Standards: EnablingInteroperability.and.package.delivery
Cloud Standards: EnablingInteroperability.and.package.delivery
Abiquo, Inc.
Ā 

What's hot (20)

Webrtc world tour_2019_2nd edition_ed1_uprism_syson
Webrtc world tour_2019_2nd edition_ed1_uprism_sysonWebrtc world tour_2019_2nd edition_ed1_uprism_syson
Webrtc world tour_2019_2nd edition_ed1_uprism_syson
Ā 
Web rtc ė™ķ–„ź³¼ ģ“ģŠˆ 2017ė…„_ģ •ė¦¬
Web rtc ė™ķ–„ź³¼ ģ“ģŠˆ 2017ė…„_ģ •ė¦¬Web rtc ė™ķ–„ź³¼ ģ“ģŠˆ 2017ė…„_ģ •ė¦¬
Web rtc ė™ķ–„ź³¼ ģ“ģŠˆ 2017ė…„_ģ •ė¦¬
Ā 
Liferay Portal Introduction
Liferay Portal IntroductionLiferay Portal Introduction
Liferay Portal Introduction
Ā 
WebRTC and VoIP: bridging the gap (Kamailio world conference 2013)
WebRTC and VoIP: bridging the gap (Kamailio world conference 2013)WebRTC and VoIP: bridging the gap (Kamailio world conference 2013)
WebRTC and VoIP: bridging the gap (Kamailio world conference 2013)
Ā 
A Practical Guide to WebRTC
A Practical Guide to WebRTCA Practical Guide to WebRTC
A Practical Guide to WebRTC
Ā 
Liferay on docker
Liferay on dockerLiferay on docker
Liferay on docker
Ā 
WebRTC - On Standards, Identity and Telco Strategy
WebRTC - On Standards, Identity and Telco StrategyWebRTC - On Standards, Identity and Telco Strategy
WebRTC - On Standards, Identity and Telco Strategy
Ā 
WebRTC: Business models and implications for mobile
WebRTC: Business models and implications for mobileWebRTC: Business models and implications for mobile
WebRTC: Business models and implications for mobile
Ā 
A jQuery for WebRTC
A jQuery for WebRTCA jQuery for WebRTC
A jQuery for WebRTC
Ā 
Liferay Configuration and Customization
Liferay Configuration and CustomizationLiferay Configuration and Customization
Liferay Configuration and Customization
Ā 
Designing Apps for Runtime Fabric: Logging, Monitoring & Object Store Persist...
Designing Apps for Runtime Fabric: Logging, Monitoring & Object Store Persist...Designing Apps for Runtime Fabric: Logging, Monitoring & Object Store Persist...
Designing Apps for Runtime Fabric: Logging, Monitoring & Object Store Persist...
Ā 
Making a decision between Liferay and Drupal
Making a decision between Liferay and DrupalMaking a decision between Liferay and Drupal
Making a decision between Liferay and Drupal
Ā 
EclipseCon Europe 2015 - liferay modularity patterns using OSGi -Rafik Harabi
EclipseCon Europe 2015 - liferay modularity patterns using OSGi -Rafik HarabiEclipseCon Europe 2015 - liferay modularity patterns using OSGi -Rafik Harabi
EclipseCon Europe 2015 - liferay modularity patterns using OSGi -Rafik Harabi
Ā 
Discover Salesforce Commerce Cloud and Vlocity Integration Patterns
Discover Salesforce Commerce Cloud and Vlocity Integration PatternsDiscover Salesforce Commerce Cloud and Vlocity Integration Patterns
Discover Salesforce Commerce Cloud and Vlocity Integration Patterns
Ā 
Vbrownbag container networking for real workloads
Vbrownbag container networking for real workloadsVbrownbag container networking for real workloads
Vbrownbag container networking for real workloads
Ā 
NetDevOps Development Environments
NetDevOps Development EnvironmentsNetDevOps Development Environments
NetDevOps Development Environments
Ā 
Liferay Italy Symposium 2015 Liferay Mobile SDK and Liferay Screens
Liferay Italy Symposium 2015 Liferay Mobile SDK and Liferay ScreensLiferay Italy Symposium 2015 Liferay Mobile SDK and Liferay Screens
Liferay Italy Symposium 2015 Liferay Mobile SDK and Liferay Screens
Ā 
Liferay DevCon 2014: Lliferay Platform - A new and exciting vision
Liferay DevCon 2014: Lliferay Platform - A new and exciting visionLiferay DevCon 2014: Lliferay Platform - A new and exciting vision
Liferay DevCon 2014: Lliferay Platform - A new and exciting vision
Ā 
Containerising the Mule Runtime with Kubernetes & From Zero to Batch : MuleS...
Containerising the Mule Runtime with Kubernetes & From Zero to Batch  : MuleS...Containerising the Mule Runtime with Kubernetes & From Zero to Batch  : MuleS...
Containerising the Mule Runtime with Kubernetes & From Zero to Batch : MuleS...
Ā 
Cloud Standards: EnablingInteroperability.and.package.delivery
Cloud Standards: EnablingInteroperability.and.package.deliveryCloud Standards: EnablingInteroperability.and.package.delivery
Cloud Standards: EnablingInteroperability.and.package.delivery
Ā 

Similar to NUBOMEDIA Webinar

Maven 2.0 - Project management and comprehension tool
Maven 2.0 - Project management and comprehension toolMaven 2.0 - Project management and comprehension tool
Maven 2.0 - Project management and comprehension tool
elliando dias
Ā 
DevNexus 2017 - Building and Deploying 12 Factor Apps in Scala, Java, Ruby, a...
DevNexus 2017 - Building and Deploying 12 Factor Apps in Scala, Java, Ruby, a...DevNexus 2017 - Building and Deploying 12 Factor Apps in Scala, Java, Ruby, a...
DevNexus 2017 - Building and Deploying 12 Factor Apps in Scala, Java, Ruby, a...
Neil Shannon
Ā 
week 4_watermark.pdfffffffffffffffffffff
week 4_watermark.pdfffffffffffffffffffffweek 4_watermark.pdfffffffffffffffffffff
week 4_watermark.pdfffffffffffffffffffff
anushka2002ece
Ā 
MongoSV 2011
MongoSV 2011MongoSV 2011
MongoSV 2011
Juan Negron
Ā 

Similar to NUBOMEDIA Webinar (20)

Maven 2.0 - Project management and comprehension tool
Maven 2.0 - Project management and comprehension toolMaven 2.0 - Project management and comprehension tool
Maven 2.0 - Project management and comprehension tool
Ā 
CQ Maven Methods
CQ Maven MethodsCQ Maven Methods
CQ Maven Methods
Ā 
CQCON CQ Maven Methods
CQCON CQ Maven MethodsCQCON CQ Maven Methods
CQCON CQ Maven Methods
Ā 
Halifax DevOps - Meet-up - July.19 2017
Halifax DevOps - Meet-up - July.19 2017Halifax DevOps - Meet-up - July.19 2017
Halifax DevOps - Meet-up - July.19 2017
Ā 
Spring boot
Spring bootSpring boot
Spring boot
Ā 
OpenStack Murano introduction
OpenStack Murano introductionOpenStack Murano introduction
OpenStack Murano introduction
Ā 
Maven
MavenMaven
Maven
Ā 
Webpack: from 0 to 2
Webpack: from 0 to 2Webpack: from 0 to 2
Webpack: from 0 to 2
Ā 
Meetup 2022 - APIs with Quarkus.pdf
Meetup 2022 - APIs with Quarkus.pdfMeetup 2022 - APIs with Quarkus.pdf
Meetup 2022 - APIs with Quarkus.pdf
Ā 
DevNexus 2017 - Building and Deploying 12 Factor Apps in Scala, Java, Ruby, a...
DevNexus 2017 - Building and Deploying 12 Factor Apps in Scala, Java, Ruby, a...DevNexus 2017 - Building and Deploying 12 Factor Apps in Scala, Java, Ruby, a...
DevNexus 2017 - Building and Deploying 12 Factor Apps in Scala, Java, Ruby, a...
Ā 
EWD 3 Training Course Part 30: Modularising QEWD Applications
EWD 3 Training Course Part 30: Modularising QEWD ApplicationsEWD 3 Training Course Part 30: Modularising QEWD Applications
EWD 3 Training Course Part 30: Modularising QEWD Applications
Ā 
Inithub.org presentation
Inithub.org presentationInithub.org presentation
Inithub.org presentation
Ā 
Environment
EnvironmentEnvironment
Environment
Ā 
Vuejs for Angular developers
Vuejs for Angular developersVuejs for Angular developers
Vuejs for Angular developers
Ā 
week 4_watermark.pdfffffffffffffffffffff
week 4_watermark.pdfffffffffffffffffffffweek 4_watermark.pdfffffffffffffffffffff
week 4_watermark.pdfffffffffffffffffffff
Ā 
Week 4 lecture material cc (1)
Week 4 lecture material cc (1)Week 4 lecture material cc (1)
Week 4 lecture material cc (1)
Ā 
Getting rid of pain with Heroku @ BrainDev Kyiv
Getting rid of pain with Heroku @ BrainDev KyivGetting rid of pain with Heroku @ BrainDev Kyiv
Getting rid of pain with Heroku @ BrainDev Kyiv
Ā 
MongoSV 2011
MongoSV 2011MongoSV 2011
MongoSV 2011
Ā 
Webapps development on ubuntu
Webapps development on ubuntuWebapps development on ubuntu
Webapps development on ubuntu
Ā 
Cloud foundry integration-with-openstack-and-docker-bangalorecf-meetup
Cloud foundry integration-with-openstack-and-docker-bangalorecf-meetupCloud foundry integration-with-openstack-and-docker-bangalorecf-meetup
Cloud foundry integration-with-openstack-and-docker-bangalorecf-meetup
Ā 

More from Boni GarcĆ­a

Selenium Manager: Automated Driver & Browser Management for Selenium WebDriver
Selenium Manager: Automated Driver & Browser Management for Selenium WebDriverSelenium Manager: Automated Driver & Browser Management for Selenium WebDriver
Selenium Manager: Automated Driver & Browser Management for Selenium WebDriver
Boni GarcĆ­a
Ā 

More from Boni GarcĆ­a (16)

Selenium Manager: Automated Driver & Browser Management for Selenium WebDriver
Selenium Manager: Automated Driver & Browser Management for Selenium WebDriverSelenium Manager: Automated Driver & Browser Management for Selenium WebDriver
Selenium Manager: Automated Driver & Browser Management for Selenium WebDriver
Ā 
WebDriverManager: the Swiss Army Knife for Selenium WebDriver
WebDriverManager: the Swiss Army Knife for Selenium WebDriverWebDriverManager: the Swiss Army Knife for Selenium WebDriver
WebDriverManager: the Swiss Army Knife for Selenium WebDriver
Ā 
Developing Selenium tests with JUnit 5
Developing Selenium tests with JUnit 5Developing Selenium tests with JUnit 5
Developing Selenium tests with JUnit 5
Ā 
Toolbox for Selenium Tests in Java: WebDriverManager and Selenium-Jupiter
Toolbox for Selenium Tests in Java: WebDriverManager and Selenium-JupiterToolbox for Selenium Tests in Java: WebDriverManager and Selenium-Jupiter
Toolbox for Selenium Tests in Java: WebDriverManager and Selenium-Jupiter
Ā 
Extending WebDriver: A cloud approach
Extending WebDriver: A cloud approachExtending WebDriver: A cloud approach
Extending WebDriver: A cloud approach
Ā 
A Proposal to Orchestrate Test Cases
A Proposal to Orchestrate Test CasesA Proposal to Orchestrate Test Cases
A Proposal to Orchestrate Test Cases
Ā 
IntroducciĆ³n y novedades de JUnit 5 (04/07/2018)
IntroducciĆ³n y novedades de JUnit 5 (04/07/2018)IntroducciĆ³n y novedades de JUnit 5 (04/07/2018)
IntroducciĆ³n y novedades de JUnit 5 (04/07/2018)
Ā 
User Impersonation as a Service in End-to-End Testing
User Impersonation as a Service in End-to-End TestingUser Impersonation as a Service in End-to-End Testing
User Impersonation as a Service in End-to-End Testing
Ā 
IntroducciĆ³n y novedades de JUnit 5 (16/01/2018)
IntroducciĆ³n y novedades de JUnit 5 (16/01/2018)IntroducciĆ³n y novedades de JUnit 5 (16/01/2018)
IntroducciĆ³n y novedades de JUnit 5 (16/01/2018)
Ā 
WebRTC Testing: State of the Art
WebRTC Testing: State of the ArtWebRTC Testing: State of the Art
WebRTC Testing: State of the Art
Ā 
ElasTest: an elastic platform for testing complex distributed large software ...
ElasTest: an elastic platform for testing complex distributed large software ...ElasTest: an elastic platform for testing complex distributed large software ...
ElasTest: an elastic platform for testing complex distributed large software ...
Ā 
Analysis of video quality and end-to-end latency in WebRTC
Analysis of video quality and end-to-end latency in WebRTCAnalysis of video quality and end-to-end latency in WebRTC
Analysis of video quality and end-to-end latency in WebRTC
Ā 
Cloud Instances of Kurento v6 on FIWARE Lab
Cloud Instances of Kurento v6 on FIWARE LabCloud Instances of Kurento v6 on FIWARE Lab
Cloud Instances of Kurento v6 on FIWARE Lab
Ā 
Kurento v6 Development Guide
Kurento v6 Development GuideKurento v6 Development Guide
Kurento v6 Development Guide
Ā 
Kurento v6 Installation Guide
Kurento v6 Installation GuideKurento v6 Installation Guide
Kurento v6 Installation Guide
Ā 
Introduction to the Stream Oriented GE (Kurento v6)
Introduction to the Stream Oriented GE (Kurento v6)Introduction to the Stream Oriented GE (Kurento v6)
Introduction to the Stream Oriented GE (Kurento v6)
Ā 

Recently uploaded

Rohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No AdvanceRohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Call Girls In Delhi Whatsup 9873940964 Enjoy Unlimited Pleasure
Ā 
Dwarka Sector 26 Call Girls | Delhi | 9999965857 šŸ«¦ Vanshika Verma More Our Se...
Dwarka Sector 26 Call Girls | Delhi | 9999965857 šŸ«¦ Vanshika Verma More Our Se...Dwarka Sector 26 Call Girls | Delhi | 9999965857 šŸ«¦ Vanshika Verma More Our Se...
Dwarka Sector 26 Call Girls | Delhi | 9999965857 šŸ«¦ Vanshika Verma More Our Se...
Call Girls In Delhi Whatsup 9873940964 Enjoy Unlimited Pleasure
Ā 
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine ServiceHot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
sexy call girls service in goa
Ā 
Call Girls Service Chandigarh Lucky ā¤ļø 7710465962 Independent Call Girls In C...
Call Girls Service Chandigarh Lucky ā¤ļø 7710465962 Independent Call Girls In C...Call Girls Service Chandigarh Lucky ā¤ļø 7710465962 Independent Call Girls In C...
Call Girls Service Chandigarh Lucky ā¤ļø 7710465962 Independent Call Girls In C...
Sheetaleventcompany
Ā 
Delhi Call Girls Rohini 9711199171 ā˜Žāœ”šŸ‘Œāœ” Whatsapp Hard And Sexy Vip Call
Delhi Call Girls Rohini 9711199171 ā˜Žāœ”šŸ‘Œāœ” Whatsapp Hard And Sexy Vip CallDelhi Call Girls Rohini 9711199171 ā˜Žāœ”šŸ‘Œāœ” Whatsapp Hard And Sexy Vip Call
Delhi Call Girls Rohini 9711199171 ā˜Žāœ”šŸ‘Œāœ” Whatsapp Hard And Sexy Vip Call
shivangimorya083
Ā 
Low Rate Young Call Girls in Sector 63 Mamura Noida āœ”ļøā˜†9289244007āœ”ļøā˜† Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida āœ”ļøā˜†9289244007āœ”ļøā˜† Female E...Low Rate Young Call Girls in Sector 63 Mamura Noida āœ”ļøā˜†9289244007āœ”ļøā˜† Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida āœ”ļøā˜†9289244007āœ”ļøā˜† Female E...
SofiyaSharma5
Ā 
Rohini Sector 6 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 6 Call Girls Delhi 9999965857 @Sabina Saikh No AdvanceRohini Sector 6 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 6 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Call Girls In Delhi Whatsup 9873940964 Enjoy Unlimited Pleasure
Ā 
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No AdvanceRohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Call Girls In Delhi Whatsup 9873940964 Enjoy Unlimited Pleasure
Ā 
Call Girls In Ashram Chowk Delhi šŸ’ÆCall Us šŸ”8264348440šŸ”
Call Girls In Ashram Chowk Delhi šŸ’ÆCall Us šŸ”8264348440šŸ”Call Girls In Ashram Chowk Delhi šŸ’ÆCall Us šŸ”8264348440šŸ”
Call Girls In Ashram Chowk Delhi šŸ’ÆCall Us šŸ”8264348440šŸ”
soniya singh
Ā 

Recently uploaded (20)

Top Rated Pune Call Girls Daund āŸŸ 6297143586 āŸŸ Call Me For Genuine Sex Servi...
Top Rated  Pune Call Girls Daund āŸŸ 6297143586 āŸŸ Call Me For Genuine Sex Servi...Top Rated  Pune Call Girls Daund āŸŸ 6297143586 āŸŸ Call Me For Genuine Sex Servi...
Top Rated Pune Call Girls Daund āŸŸ 6297143586 āŸŸ Call Me For Genuine Sex Servi...
Ā 
Rohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No AdvanceRohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 22 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Ā 
āœ‚ļø šŸ‘… Independent Andheri Escorts With Room Vashi Call Girls šŸ’ƒ 9004004663
āœ‚ļø šŸ‘… Independent Andheri Escorts With Room Vashi Call Girls šŸ’ƒ 9004004663āœ‚ļø šŸ‘… Independent Andheri Escorts With Room Vashi Call Girls šŸ’ƒ 9004004663
āœ‚ļø šŸ‘… Independent Andheri Escorts With Room Vashi Call Girls šŸ’ƒ 9004004663
Ā 
Dwarka Sector 26 Call Girls | Delhi | 9999965857 šŸ«¦ Vanshika Verma More Our Se...
Dwarka Sector 26 Call Girls | Delhi | 9999965857 šŸ«¦ Vanshika Verma More Our Se...Dwarka Sector 26 Call Girls | Delhi | 9999965857 šŸ«¦ Vanshika Verma More Our Se...
Dwarka Sector 26 Call Girls | Delhi | 9999965857 šŸ«¦ Vanshika Verma More Our Se...
Ā 
š“€¤Call On 7877925207 š“€¤ Ahmedguda Call Girls Hot Model With Sexy Bhabi Ready Fo...
š“€¤Call On 7877925207 š“€¤ Ahmedguda Call Girls Hot Model With Sexy Bhabi Ready Fo...š“€¤Call On 7877925207 š“€¤ Ahmedguda Call Girls Hot Model With Sexy Bhabi Ready Fo...
š“€¤Call On 7877925207 š“€¤ Ahmedguda Call Girls Hot Model With Sexy Bhabi Ready Fo...
Ā 
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girl
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call GirlVIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girl
VIP 7001035870 Find & Meet Hyderabad Call Girls LB Nagar high-profile Call Girl
Ā 
Moving Beyond Twitter/X and Facebook - Social Media for local news providers
Moving Beyond Twitter/X and Facebook - Social Media for local news providersMoving Beyond Twitter/X and Facebook - Social Media for local news providers
Moving Beyond Twitter/X and Facebook - Social Media for local news providers
Ā 
Hot Call Girls |Delhi |Hauz Khas ā˜Ž 9711199171 Book Your One night Stand
Hot Call Girls |Delhi |Hauz Khas ā˜Ž 9711199171 Book Your One night StandHot Call Girls |Delhi |Hauz Khas ā˜Ž 9711199171 Book Your One night Stand
Hot Call Girls |Delhi |Hauz Khas ā˜Ž 9711199171 Book Your One night Stand
Ā 
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine ServiceHot Service (+9316020077 ) Goa  Call Girls Real Photos and Genuine Service
Hot Service (+9316020077 ) Goa Call Girls Real Photos and Genuine Service
Ā 
Call Girls Service Chandigarh Lucky ā¤ļø 7710465962 Independent Call Girls In C...
Call Girls Service Chandigarh Lucky ā¤ļø 7710465962 Independent Call Girls In C...Call Girls Service Chandigarh Lucky ā¤ļø 7710465962 Independent Call Girls In C...
Call Girls Service Chandigarh Lucky ā¤ļø 7710465962 Independent Call Girls In C...
Ā 
Delhi Call Girls Rohini 9711199171 ā˜Žāœ”šŸ‘Œāœ” Whatsapp Hard And Sexy Vip Call
Delhi Call Girls Rohini 9711199171 ā˜Žāœ”šŸ‘Œāœ” Whatsapp Hard And Sexy Vip CallDelhi Call Girls Rohini 9711199171 ā˜Žāœ”šŸ‘Œāœ” Whatsapp Hard And Sexy Vip Call
Delhi Call Girls Rohini 9711199171 ā˜Žāœ”šŸ‘Œāœ” Whatsapp Hard And Sexy Vip Call
Ā 
Call Now ā˜Ž 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.
Call Now ā˜Ž 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.Call Now ā˜Ž 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.
Call Now ā˜Ž 8264348440 !! Call Girls in Sarai Rohilla Escort Service Delhi N.C.R.
Ā 
Low Rate Young Call Girls in Sector 63 Mamura Noida āœ”ļøā˜†9289244007āœ”ļøā˜† Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida āœ”ļøā˜†9289244007āœ”ļøā˜† Female E...Low Rate Young Call Girls in Sector 63 Mamura Noida āœ”ļøā˜†9289244007āœ”ļøā˜† Female E...
Low Rate Young Call Girls in Sector 63 Mamura Noida āœ”ļøā˜†9289244007āœ”ļøā˜† Female E...
Ā 
Networking in the Penumbra presented by Geoff Huston at NZNOG
Networking in the Penumbra presented by Geoff Huston at NZNOGNetworking in the Penumbra presented by Geoff Huston at NZNOG
Networking in the Penumbra presented by Geoff Huston at NZNOG
Ā 
INDIVIDUAL ASSIGNMENT #3 CBG, PRESENTATION.
INDIVIDUAL ASSIGNMENT #3 CBG, PRESENTATION.INDIVIDUAL ASSIGNMENT #3 CBG, PRESENTATION.
INDIVIDUAL ASSIGNMENT #3 CBG, PRESENTATION.
Ā 
Nanded City ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready ...
Nanded City ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready ...Nanded City ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready ...
Nanded City ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready ...
Ā 
Rohini Sector 6 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 6 Call Girls Delhi 9999965857 @Sabina Saikh No AdvanceRohini Sector 6 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 6 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Ā 
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No AdvanceRohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Rohini Sector 26 Call Girls Delhi 9999965857 @Sabina Saikh No Advance
Ā 
Enjoy Nightāš”Call Girls Dlf City Phase 3 Gurgaon >ą¼’8448380779 Escort Service
Enjoy Nightāš”Call Girls Dlf City Phase 3 Gurgaon >ą¼’8448380779 Escort ServiceEnjoy Nightāš”Call Girls Dlf City Phase 3 Gurgaon >ą¼’8448380779 Escort Service
Enjoy Nightāš”Call Girls Dlf City Phase 3 Gurgaon >ą¼’8448380779 Escort Service
Ā 
Call Girls In Ashram Chowk Delhi šŸ’ÆCall Us šŸ”8264348440šŸ”
Call Girls In Ashram Chowk Delhi šŸ’ÆCall Us šŸ”8264348440šŸ”Call Girls In Ashram Chowk Delhi šŸ’ÆCall Us šŸ”8264348440šŸ”
Call Girls In Ashram Chowk Delhi šŸ’ÆCall Us šŸ”8264348440šŸ”
Ā 

NUBOMEDIA Webinar

  • 2. Table of contents 1. Introduction 2. NUBOMEDIA development 3. NUBOMEDIA PaaS 4. Let's get to work 5. Summary
  • 3. Table of contents 1. Introduction āˆ’ Review āˆ’ What is NUBOMEDIA? āˆ’ References 1. NUBOMEDIA development 2. NUBOMEDIA PaaS 3. Let's get to work 4. Summary
  • 4. 1. Introduction Review āˆ’Kurento is a media server and a set of APIs aimed to create applications with advance media capabilities āˆ’The building blocks for applications are named media elements, chained into media pipelines
  • 5. 1. Introduction What is NUBOMEDIA? āˆ’NUBOMEDIA is an open source PaaS (Platform as a Service) based on Kurento āˆ’NUBOMEDIA exposes to developers the ability of deploying and leveraging applications with media capabilities
  • 6. 1. Introduction References āˆ’Home page http://www.nubomedia.eu/ āˆ’Developers guide http://nubomedia.readthedocs.io/ āˆ’GitHub organization https://github.com/nubomedia/ āˆ’Support for developers https://groups.google.com/forum/#!forum/nubomedia-dev
  • 7. Table of contents 1. Introduction 2. NUBOMEDIA development āˆ’ Architecture āˆ’ Media API āˆ’ Kurento vs NUBOMEDIA apps 1. NUBOMEDIA PaaS 2. Let's get to work 3. Summary
  • 8. 2. NUBOMEDIA development Architecture āˆ’The Architecture in NUBOMEDIA is the same than in Kurento ā€¢ Three-tier model (inspired in the Web) Client Application Server Media Server NUBOMEDIA PaaS
  • 9. 2. NUBOMEDIA development Architecture āˆ’Like every application with media capabilities, it is important to distinguish between the media and signaling plane Client Application Server Media Server NUBOMEDIA PaaS signaling media
  • 10. 2. NUBOMEDIA development Media API āˆ’Kurento Media API allows to Java developers consume the media services provided by Kurento Media Server (KMS) āˆ’Concepts: ā€¢ Media Element ā€¢ Media Pipeline
  • 11. 2. NUBOMEDIA development Media API āˆ’KMS instances are provided elastically by NUBOMEDIA ā€¢ The number of available KMS instances depends on the PaaS Manager configuration āˆ’Each KMS has a total amount of available points to create Media Pipelines and Media Elements ā€¢ The total points depends on the number of VCPUs of the KMS ā€¢ The type of the instance can be selected on the PaaS Manager configuration Instance type # VCPUs KMS points Medium 2 200 Large 4 400
  • 12. 2. NUBOMEDIA development Kurento vs NUBOMEDIA apps 1.Maven dependencies <dependency> <groupId>org.kurento</groupId> <artifactId>kurento-client</artifactId> </dependency> <dependency> <groupId>de.fhg.fokus.nubomedia</groupId> <artifactId>nubomedia-media-client</artifactId> </dependency> <dependency> <groupId>org.kurento</groupId> <artifactId>kurento-client</artifactId> </dependency> In Kurento apps, we need the kurento-client library to handle KMS from the Java logic In NUBOMEDIA apps, we need to include also the nubomedia- media-client to discover KMSs within the NUBOMEDIA PaaS
  • 13. 2. NUBOMEDIA development Kurento vs NUBOMEDIA apps 2.Instance of KurentoClient int sessionPoints = 25; // Chose a convenient value for your pipeline Properties properties = new Properties(); properties.add("loadPoints", sessionPoints); KurentoClient kurentoClient = KurentoClient.create(properties); @Bean public KurentoClient kurentoClient() { return KurentoClient.create(); } @Autowired private KurentoClient kurento; In Kurento, KMS is controlled by an single instance of KurentoClient (for example a Spring Bean) In NUBOMEDIA, each new media session should create an instance of KurentoClient. The points mechanism is used to locate or create KMS instances (scaling in/out)
  • 14. 2. NUBOMEDIA development Kurento vs NUBOMEDIA apps 3.Deployment: Dockerfile In Kurento, no Dokerfile is required (deployment is managed by hand) In NUBOMEDIA, a Dokerfile file is required FROM nubomedia/apps-baseimage:src MAINTAINER Nubomedia ADD . /home/nubomedia ENTRYPOINT cd /home/nubomedia && mvn spring- boot:run
  • 15. Table of contents 1. Introduction 2. NUBOMEDIA development 3. NUBOMEDIA PaaS āˆ’ Introduction āˆ’ PaaS GUI 1. Let's get to work 2. Summary
  • 16. 3. NUBOMEDIA PaaS Introduction āˆ’The NUBOMEDIA PaaS manager is a tool aimed to control the way in which the NUBOMEDIA applications are built and deployed inside the NUBOMEDIA PaaS āˆ’The capabilities provided by the Paas Manager can be used by developers using the PaaS GUI: ā€¢ The PaaS Manager GUI is a web application that allows to use the NUBOMEDIA PaaS Manager
  • 17. 3. NUBOMEDIA PaaS Introduction āˆ’Internally, the NUBOMEDIA PaaS uses Docker containers to deploy applications āˆ’Therefore it is a requirement to include a Dockerfile in GitHub repository to be deployed on NUBOMEDIA āˆ’Example: FROM nubomedia/apps-baseimage:src MAINTAINER Nubomedia ADD . /home/nubomedia ENTRYPOINT cd /home/nubomedia && mvn spring-boot:run https://docs.docker.com/engine/reference/builder/
  • 18. PaaS GUI āˆ’Web application to manage NUBOMEDIA applications 3. NUBOMEDIA PaaS http://paas-manager.nubomedia.eu:8081/ Credentials needed to login
  • 19. 3. NUBOMEDIA PaaS PaaS GUI āˆ’A NUBOMEDIA application can be deployed using the PaaS GUI āˆ’It is done providing the GitHub repository URL and a set of configuration parameters
  • 20. PaaS GUI āˆ’Most important configuration values: 3. NUBOMEDIA PaaS KMS host type: -Medium = 2 VCPUs (200 points) -Large = 4 VCPUs (400 points) Number of KMSs GitHub URL repository
  • 21. Table of contents 1. Introduction 2. NUBOMEDIA development 3. NUBOMEDIA PaaS 4. Let's get to work āˆ’ Introduction āˆ’ Server-side āˆ’ Client-side āˆ’ Deployment 1. Summary
  • 22. 4. Let's get to work Introduction āˆ’Devil is in the details, and so, we are going to see a complete NUBOMEDIA step by step āˆ’This application is the nubomedia-magic-mirror tutorial https://github.com/nubomedia/nubomedia-magic-mirror/ http://nubomedia.readthedocs.io/en/latest/tutorial/nubomedia-magic-mirror/
  • 23. 4. Let's get to work Server-side āˆ’We recommend Spring-Boot as the base technology for NUBOMEDIA applications ā€¢ Spring-Boot embeds a Tomcat server in a simple seamless way for developers ā€¢ The application is packaged as a runnable JAR, and when this JAR is executed, the Tomcat server is started and the web application automatically deployed āˆ’We recommend Maven as for managing the life-cycle and managing the dependencies of our applications
  • 24. 4. Let's get to work Server-side āˆ’The first step is to clone GitHub repository āˆ’We recommend use an IDE to develop applications. For example, Eclipse (importing app as Maven project) git clone https://github.com/nubomedia/nubomedia-magic-mirror
  • 25. 4. Let's get to work Server-side āˆ’First step is understand the pom.xml file: <parent> <groupId>org.kurento</groupId> <artifactId>kurento-parent-pom</artifactId> <version>6.6.0</version> </parent> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven- plugin</artifactId> </plugin> </plugins> Inherit from kurento-parent-pom makes simpler our pom.xml by reusing versions defined in the parent We can use the spring-boot Maven plugin to simplify the packaging as executable JAR
  • 26. 4. Let's get to work Server-side <dependencies> <!-- Spring --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> </dependency> <!-- Kurento --> <dependency> <groupId>org.kurento</groupId> <artifactId>kurento-client</artifactId> </dependency> <dependency> <groupId>org.kurento</groupId> <artifactId>kurento-utils-js</artifactId> </dependency> <!-- Nubomedia --> <dependency> <groupId>de.fhg.fokus.nubomedia</groupId> <artifactId>nubomedia-media-client</artifactId> <version>${nubomedia-media- client.version}</version> </dependency> ā€¦ ā€¦ Dependencies clause is one of the most important. Notice that our app depends on Spring, Kurento, NUBOMEDIA and WebJars (for the client-side) ā€¦
  • 27. 4. Let's get to work Server-side āˆ’We need to define also the way in which signaling is going to work in our application āˆ’For the shake of simplicity, we use a raw WebSocket between the server and client side āˆ’We need to define the messages exchanged to carry out the communication about client and server clientserver start startResponse iceCandidate onIceCandidate stop error notEnoughResources Starts a media session ICE candidates (WebRTC negotiation) Stops a media session Error cases
  • 28. 4. Let's get to work Server-side āˆ’The class diagram of our application is the following: MagicMirrorApp MagicMirrorHandler UserSession Main class Message handler (signaling) User session (session id, media logic)
  • 29. 4. Let's get to work Server-side @SpringBootApplication @EnableWebSocket public class MagicMirrorApp implements WebSocketConfigurer { @Bean public MagicMirrorHandler handler() { return new MagicMirrorHandler(); } @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(handler(), "/magicmirror"); } public static void main(String[] args) throws Exception { new SpringApplication(MagicMirrorApp.class).run(args); } } MagicMirrorApp defines the Spring-Boot application and the WebSocket used for signaling ("/magicmirror", managed by MagicMirrorHandler)
  • 30. 4. Let's get to work Server-side public class MagicMirrorHandler extends TextWebSocketHandler { private final ConcurrentHashMap<String, UserSession> users = new ConcurrentHashMap<>(); @Override public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { JsonObject jsonMessage = new GsonBuilder().create().fromJson(message.getPayload(), JsonObject.class); switch (jsonMessage.get("id").getAsString()) { case "start": start(session, jsonMessage); break; case "stop": release(session); break; case "onIceCandidate": onIceCandidate(session, jsonMessage); break; default: error(session, "Invalid message with id " + jsonMessage.get("id").getAsString()); break; } } MagicMirrorHandler manages signaling messages. It keeps a collection of user sessions (thread-safe map users)
  • 31. 4. Let's get to work Server-side public class UserSession { public String startSession(final WebSocketSession session, String sdpOffer) { // One KurentoClient instance per session (reserving points per session) Properties properties = new Properties(); properties.add("loadPoints", POINTS_PER_SESSION); kurentoClient = KurentoClient.create(properties); // Media logic (pipeline and media elements connectivity) mediaPipeline = kurentoClient.createMediaPipeline(); webRtcEndpoint = new WebRtcEndpoint.Builder(mediaPipeline).build(); FaceOverlayFilter faceOverlayFilter = new FaceOverlayFilter.Builder(mediaPipeline).build(); faceOverlayFilter.setOverlayedImage("http://files.kurento.org/img/mario-wings.png", -0.35F, -1.2F, 1.6F, 1.6F); webRtcEndpoint.connect(faceOverlayFilter); faceOverlayFilter.connect(webRtcEndpoint); // WebRTC negotiation String sdpAnswer = webRtcEndpoint.processOffer(sdpOffer); webRtcEndpoint.gatherCandidates(); return sdpAnswer; } UserSession handles media logic (media pipeline, media elements, WebRTC negotiationā€¦)
  • 32. 4. Let's get to work Server-side āˆ’As of Chrome 47, access to user media can only be done by secure apps (HTTPS), and so, it is needed a Java keystore server.port: 8443 server.ssl.key-store: classpath:keystore.jks server.ssl.key-store-password: kurento server.ssl.keyStoreType: JKS server.ssl.keyAlias: kurento-selfsigned application.properties http://doc-kurento.readthedocs.io/en/stable/mastering/securing-kurento-applications.html
  • 33. 4. Let's get to work Client-side <!-- WebJars --> <dependency> <groupId>org.webjars</groupId> <artifactId>webjars-locator</artifactId> </dependency> <dependency> <groupId>org.webjars.bower</groupId> <artifactId>demo-console</artifactId> </dependency> <dependency> <groupId>org.webjars.bower</groupId> <artifactId>adapter.js</artifactId> </dependency> <dependency> <groupId>org.webjars.bower</groupId> <artifactId>jquery</artifactId> </dependency> <dependency> <groupId>org.webjars.bower</groupId> <artifactId>ekko-lightbox</artifactId> </dependency> </dependencies> ā€¦ Client-side dependencies are handled by Maven WebJars allows to declare client-side dependencies (i.e. CSS and JavaScript libraries) also in the pom.xml. These libraries are used linked in the HTML client-side pages
  • 34. 4. Let's get to work Client-side āˆ’The app has been implemented as a SPA (single page application) which contains a single HTML <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="webjars/bootstrap/dist/css/bootstrap.min.css"> <link rel="stylesheet" href="webjars/ekko-lightbox/dist/ekko-lightbox.min.css"> <link rel="stylesheet" href="webjars/demo-console/index.css"> <link rel="stylesheet" href="css/styles.css"> <script src="webjars/jquery/dist/jquery.min.js"></script> <script src="webjars/bootstrap/dist/js/bootstrap.min.js"></script> <script src="webjars/ekko-lightbox/dist/ekko-lightbox.min.js"></script> <script src="webjars/adapter.js/adapter.js"></script> <script src="webjars/demo-console/index.js"></script> <script src="js/kurento-utils.js"></script> <script src="js/index.js"></script> <title>NUBOMEDIA Tutorial: WebRTC Magic Mirror</title> </head> JavaScript/CSS are linked here. Using Bootstrap to provide responsive design
  • 35. 4. Let's get to work Client-side āˆ’A JavaScript file contains the client-side logic (message handling and WebRtcPeer use) var ws = new WebSocket('wss://' + location.host + '/magicmirror'); ws.onmessage = function(message) { var parsedMessage = JSON.parse(message.data); switch (parsedMessage.id) { case 'startResponse': startResponse(parsedMessage); break; case 'error': onError("Error message from server: " + parsedMessage.message); stop(false); break; case 'iceCandidate': webRtcPeer.addIceCandidate(parsedMessage.candidate, function(error) { if (error) return console.error("Error adding candidate: " + error); }); break; // ... } }
  • 36. 4. Let's get to work Client-side āˆ’A JavaScript file contains the client-side logic (message handling and WebRtcPeer use) var webRtcPeer; function start() { var options = { localVideo : videoInput, remoteVideo : videoOutput, onicecandidate : onIceCandidate } webRtcPeer = new kurentoUtils.WebRtcPeer.WebRtcPeerSendrecv(options, function(error) { if (error) { return console.error(error); } webRtcPeer.generateOffer(onOffer); }); }
  • 37. 4. Let's get to work Deployment āˆ’We need a Dockerfile to deploy our app FROM nubomedia/apps-baseimage:src MAINTAINER Nubomedia ADD . /home/nubomedia ENTRYPOINT cd /home/nubomedia && mvn exec:java
  • 38. 4. Let's get to work Deployment āˆ’Finally we can deploy our app in the NUBOMEDIA PaaS:
  • 39. 4. Let's get to work Deployment āˆ’The app changes its state, from CREATED to RUNNING (it takes a couple of minutes to finish):
  • 40. 4. Let's get to work Deployment āˆ’We can trace two types of logs: build and app I0708 12:51:02.335080 1 builder.go:41] $BUILD env var is {"kind":"Build","apiVersion":"v1","metadata":{...} I0708 12:51:02.423366 1 source.go:96] git ls-remote https://github.com/nubomedia/nubomedia-magic-mirror --heads I0708 12:51:02.423547 1 repository.go:275] Executing git ls-remote https://github.com/nubomedia/nubomedia-magic-mirror --heads I0708 12:51:04.931566 1 source.go:189] Cloning source from https://github.com/nubomedia/nubomedia-magic- mirror ... Image already exists latest: digest: sha256:24ac51ca448edfb1582f0bffc990c95506065f0aa26d5b295d 1cb32d35ce2dfe size: 49623 I0708 12:54:31.392578 1 docker.go:99] Push successful
  • 41. 4. Let's get to work Deployment āˆ’We can trace two types of logs: build and app [INFO] Scanning for projects... [INFO] [INFO] ---------------------------------------- [INFO] Building NUBOMEDIA Java Tutorial - Magic Mirror 6.5.0 [INFO] ---------------------------------------- [INFO] [INFO] --- exec-maven-plugin:1.4.0:java (default-cli) @ nubomedia-magic-mirror --- `.-:////:-.` -+shmmmmmmmmmmmmmmhs/- `/ymmmmmmmmmmmmmmmmmmmmmmmms/` -smmmmmmmmyo+/:----:/+ohmmmmmmmms. -ymmmmmmy+. -+hmmmmmmy. -------` `ommmmmd+` .+dmmmmmo +oooooo- .hmmmmm+ `ommmmmh` +oooooo- .dmmmmh. ``````` +oooooo- sdddddds `dmmmmy .dhhhhhh. ```````` smmmmmmy ./+osyysymmmmy .mmmmmmm. smmmmmmy `:sdmmmmmmmmmmmmd` .mmmmmmm. -----` +yyyyyy+ `+dmmmmmmdhyyyhdmm+ .hhhhhhh. ooooo- -------- -dmmmmmy:` `:` ooooo- .----. oooooooo` -mmmmmy. .....` hmmmms oooooooo` dmmmms yhd- hmmmms oooooooo` :mmmmm` syy- /++++: :::::::: /mmmmm `mmmmm/ -ss: os` os` -s/ -ssssss+- .+syys+. -//. ://` .::///- -/////:. // .//` +mmmmm: :mdm/ hm. hm. /mo :my---/mm`:md:..:dm/ /o+o` -o+o` /o:.```` :o:``.:o+ oo `o/++ smmmmh :ms:m+ ym. hm. /mo :mh+++smo ym/ :mh /o.o: `o/:o`.oo:::::. :o- /o- oo +o`.o/ /mmmh :ms :moym. hm. /mo :my:::+mh sm+ /my /o.-o./o`/o`.oo.....` :o- +o- oo /o+//+o: `odh :ms -mmm. +my::/dm- :my///omm`.dm+::+mm- /o. +oo: /o` :o/----. :o/---/o/ oo -o:..../o. - .+: .++` ./+++:` .++++++:` `:+oo+:` .-` `-- .-` `-----. .------` -- -- `-- ... 2016-07-08 12:55:32.702 INFO 6 --- [irrorApp.main()] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8443 (https) 2016-07-08 12:55:32.713 INFO 6 --- [irrorApp.main()] e.n.tutorial.magicmirror.MagicMirrorApp : Started MagicMirrorApp in 10.529 seconds (JVM running for 31.135)
  • 43. Table of contents 1. Introduction 2. NUBOMEDIA development 3. NUBOMEDIA PaaS 4. Let's get to work 5. Summary āˆ’ Things to remember for NUBOMEDIA apps
  • 44. 5. Summary Things to remember for NUBOMEDIA apps āˆ’From a high level point of view: ā€¢ The media-api concepts (media pipelines, media elements) are exactly the same in NUBOMEDIA ā€¢ The NUBOMEDIA PaaS is going to provide elastically instances of KMSs to our application āˆ’From a low level point of view: 1. We need to add the nubomedia-media-client dependency 2. We need to create a KurentoClient instance per media session in order to inform the PaaS when KMSs are required 3. We need a Dockerfile to configure the execution point of our application