Wednesday, December 30, 2015

DevOps Docker

Intoduction Docker :

Docker is an open platform for developing, shipping, and running applications. Docker is designed to deliver your applications faster. With Docker you can separate your applications from your infrastructure and treat your infrastructure like a managed application. Docker helps you ship code faster, test faster, deploy faster, and shorten the cycle between writing code and running code.

Install Docker in ubuntu ...

Building Image From a Dockerfile


Example Dokerfile :

1- install jdk
2- install apache-tomcat
3- deploy application 

###########################
FROM ubuntu
MAINTAINER kallel wassim <kallel.wassim@gmail.com>
RUN mkdir -p /opt/programs/sample-docker
COPY apache-tomcat-8.0.28.tar.gz  /opt/programs/sample-docker/
WORKDIR /opt/programs/sample-docker
RUN tar -xzf apache-tomcat-8.0.28.tar.gz
RUN rm /opt/programs/sample-docker/apache-tomcat-8.0.28.tar.gz
COPY MyApp.war /opt/programs/sample-docker/apache-tomcat-8.0.28/webapps/
ADD server.xml /opt/programs/sample-docker/apache-tomcat-8.0.28/conf/
COPY jdk-8u45-linux-x64.tar.gz /opt/programs/sample-docker/
WORKDIR /opt/programs/sample-docker
RUN tar -xzf jdk-8u45-linux-x64.tar.gz
RUN rm /opt/programs/sample-docker/jdk-8u45-linux-x64.tar.gz
ENV JAVA_HOME /opt/programs/sample-docker/jdk1.8.0_45
ENV PATH ${PATH}:${JAVA_HOME}/bin
EXPOSE 8080
CMD /opt/programs/sample-docker/apache-tomcat-8.0.28/bin/catalina.sh start

###############

Dockerfile description command

Instruction Description
FROM This must be the first instruction in the Dockerfile and identifies the image to inherit from.
MAINTAINER Provides visibility and credit to the author of the image
RUN Executes a Linux command for configuring and installing
ENTRYPOINT The final script or application used  to bootstrap the container, making it an executable application
CMD Provide default arguments to the ENTRYPOINT using a JSON array format
LABEL Name/value metadata about the image
ENV Sets environment variables
COPY Copies files into the container
ADD Alternative to copy
WORKDIR Sets working directory for RUN, CMD, ENTRYPOINT, COPY, and/or ADD instructions
EXPOSE Ports the container will listen on
VOLUME Creates a mount point
USER User to run RUN, CMD, and/or ENTRYPOINT instructions



Building & Running image

To build this image from the directory containing the Dockerfile, run the
following command:

docker build -t  java_ee/sample_java_ee .


to run this image

docker run -t java_ee/sample_java_ee

http://127.0.0.1:8080/MyApp/


Test running container

docker ps -l

CONTAINER ID        IMAGE                           COMMAND                CREATED             STATUS                     PORTS               NAMES
6c292075af88        java_ee/sample_java_ee:latest   "/bin/sh -c '/opt/pr   7 seconds ago       Exited (0) 6 seconds ago                       jolly_sinoussi     


 Starting & Stoping image

#to start image

docker start sample_java_ee

#to stop image

docker stop sample_java_ee

Push image to Repository

Now push your image using the push command, specifying your username, image name, and version number.

docker push java_ee/sample_java_ee


Architecture DevOps Docker solution










Thursday, January 22, 2015

AngularJS starter ,Spring Data,MongoDB,RestFul,CRUD,HTML5


    AngularJS Starter


AngularJs : similar to Backbone or JavaScriptMVC is complete solution for rapid front-end development . No other plugins or frameworks are necessary to build a data-driven web application It's developed by Google , that assists with running single-page applications. Its goal is to argument browser-based applications with model-view-controller(MVC) capability, in effort to make both developement and test easier.

Advantages AngularJS
  • RestFul : actions are quickly becoming the standard for communicating from the server to the client. In One line of JavaScript you can quickly talk to the server and get the data you need to interact with your web pages. AngularJS turns this into a simple JavaScript object , as Models
  • MVVM to Rescue Models talk to ViewModel objects (through something called the $scope object),which listen for changes to the Models. These can then be delivered and rendered by the Views, which is the HTML that expresses your code.
  • Data Binding and Dependency Injection . Everything in the MVVM pattern is communicated automatically across the UI whenever anything changes. The elimantes the nedd for wrappers getters/setters or class declarations. AngularJs handles all of this so you can express your data as simply as with JavaScript primitives , like arrays or as complex as you wish , through custom types.
  • Entreprise-level Testing : As stated above , Angular Js requires no additional frameworks or plugins including testing if you're familar with projects like Qunit ,Mocha or Jasmine.

    AngularJS is JavaScriptMVC architecture than her code  is always organized into models,views,controllers and (optionally) services :
      Models :are JavaScript objects that represent the data application can access.
    Views : they are responsible for representing the data from models to the user in a visual and useful format.and intercept generic user interactions-including clicks and option list selections
    Controllers : define the actual behavior of your application and play key rĂ´le in connecting the right models to the right views.
    Services : are specialized objects that perform work on behalf of other objects.
     for More detail AngularJS
     In my example I'm developed a simple crud  I'm used to spring restful,spring data in my backend and Maven for managment dependencies and build project.  you should install a MongoDB for this example
  • index.html
<html lang="en" ng-app="contacts">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My AngularJS App</title>
<link rel="stylesheet" href="css/app.css" />
<link rel="stylesheet" href="css/bootstrap/bootstrap-responsive.min.css" />
<link rel="stylesheet" href="css/bootstrap/bootstrap.min.css" />
</head>
<body>
<div class="navbar navbar-fixed">
<div class="navbar-inner">
<ul class="nav">

<li><a href="#/contact-list">Liste contacts</a></li>
<li><a href="#/contact-creation">Create contact</a></li>
</ul>
</div></div>
<div ng-view></div>
<script src="js/bootstrap/bootstrap.js"/>
<script src="js/jquery/jquery-2.0.3.js"></script>
<script src="lib/angular/angular.js"></script>
<script src="lib/angular/angular-resource.js"></script>
<script src="js/app.js"></script>
<script src="js/services.js"></script>
<script src="js/controllers.js"></script>
<script src="js/filters.js"></script>
<script src="js/directives.js"></script>
</body>
</html>

app.js
// Declare app level module which depends on filters, and services
angular.module('contacts', ['contacts.filters', 'contacts.services', 'contacts.directives', 'contacts.controllers']).
config(['$routeProvider', function ($routeProvider) {
,,,,,,,,,,,,,,
$routeProvider.when('/contact-detail/:id', {templateUrl: 'partial/contact-detail.html', controller: 'ContactDetailCtrl'});
 ,,,,,,,,,,,,,,,,,,,,
}]);
controllers.js
var app=angular.module('contacts.controllers',[]);


});
app.controller('ContactListCtrl',['$scope','ContactsFactory','ContactFactory','$location','$log',function($scope,ContactsFactory,ContactFactory,$location,$log){
$scope.deleteContact=function(id)
{
,,,,,,,,,,,,,,,,
$scope.editContact=function(id){
$location.path('/contact-detail/'+id);
};
$scope.createNewContact=function(){
$location.path('/contact-creation');
};
$scope.contacts=ContactsFactory.query();
}]);

............

services.js
var services=angular.module('contacts.services',['ngResource']);
services.factory('ContactsFactory',function($resource){
return $resource('http://example.com/contacts',{},{
query:{method:'GET',isArray:true},
create:{method:'POST'}
})
});

contact-creation.html
<div class="container">
<h1>Create a new Contact</h1>

<form novalidate="novalidate" class="form-horizontal">
<div class="control-group">
<label class="control-label" for="inputFirstName">First name:</label>

<div class="controls">
<input type="text" id="inputFirstName" ng-model="contact.firstName" placeholder="First name"/>
</div>
</div>
<div class="control-group">
<label class="control-label" for="inputLastName">Last name:</label>

<div class="controls">
<input type="text" id="inputLastName" ng-model="contact.lastName" placeholder="Last name"/>
</div>
</div>
<div class="control-group">
<label class="control-label" for="inputEmail">E_mail:</label>

<div class="controls">
<input type="text" id="inputEmail" ng-model="contact.email" placeholder="E_mail" required/>
</div>
</div>
<div class="control-group">
<div class="controls">
<a ng-click="createNewContact()" class="btn btn-small btn-primary">create new contact</a>
</div>
</div>
</form>
</div>
.......
contact-list.html
<div ng-controller="ControlerContactCtrl" >
<table class="table table-striped" >
<thead>
<tr>
<th>First name</th>
<th>Last name</th>
<th>Update</th>
<th>Delete</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="contact in contacts">
<td>{{ contact.firstName }}</td>
<td>{{ contact.lastName }}</td>
<td><a ng-click="editContact(contact.id)"
class="btn btn-small btn-primary">edit</a></td>
<td><a ng-click="deleteContact(contact.id)"
class="btn btn-small btn-danger">delete</a></td>
</tr>
</tbody>
</table>
</div>

In my backend I'm used Spring Restful for more detail

@Controller
public class ContactRestComponent {
@Resource
public EContactsServices eContactsServices;

@RequestMapping(value = "/contacts", method = RequestMethod.GET)
@ResponseBody
public List<EContacts> getAllContacts() {
return eContactsServices.getAllEContacts();
}

@RequestMapping(value = "/contacts/{id}", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public EContacts getContactById(@PathVariable("id") String id) {
return eContactsServices.getEcontactById(id);
}
,,,,,,,,,
}

In my pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>mycompany.org.contacts</groupId>
<artifactId>AngularJs-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<java-version>1.6</java-version>
<org.springframework-version>3.2.1.RELEASE</org.springframework-version> <org.slf4j-version>1.6.6</org.slf4j-version>
<spring.data.version>1.3.2.RELEASE</spring.data.version>
<mongo-java-driver.version>2.11.1</mongo-java-driver.version>
<commons-lang3.version>3.1</commons-lang3.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.8</version>
</dependency>
<dependency>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<artifactId>spring-web</artifactId>
<groupId>org.springframework</groupId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<artifactId>spring-webmvc</artifactId>
<groupId>org.springframework</groupId>
<version>${org.springframework-version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>

<!-- mongodb java driver -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.11.0</version>
</dependency>

<!-- Spring data mongodb -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.2.0.RELEASE</version>
</dependency>
<!--
Unit testing ======================================================
-->
</dependencies>
<build>
<finalName>AngularJs-starter</finalName>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
</plugins>
</build>
</project>


Conclusion :AngularJS is quickly becoming the dominant JavaScript framework for professional web development.
  • We’ve reviewed how Google came to develop this framework as a way to make the most of HTML.