mirror of https://github.com/portainer/portainer
				
				
				
			
							parent
							
								
									d227bdfc75
								
							
						
					
					
						commit
						b997b787c4
					
				| 
						 | 
				
			
			@ -19,9 +19,7 @@ angular.module('uifordocker', [
 | 
			
		|||
  'swarm',
 | 
			
		||||
  'network',
 | 
			
		||||
  'networks',
 | 
			
		||||
  'createNetwork',
 | 
			
		||||
  'volumes',
 | 
			
		||||
  'createVolume'])
 | 
			
		||||
  'volumes'])
 | 
			
		||||
  .config(['$stateProvider', '$urlRouterProvider', '$httpProvider', function ($stateProvider, $urlRouterProvider, $httpProvider) {
 | 
			
		||||
    'use strict';
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,12 +24,8 @@ function ($scope, $state, Config, Container, Image, Volume, Network, Messages, V
 | 
			
		|||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  $scope.resetVolumePath = function(index) {
 | 
			
		||||
    $scope.formValues.Volumes[index].name = '';
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  $scope.addVolume = function() {
 | 
			
		||||
    $scope.formValues.Volumes.push({ name: '', containerPath: '', readOnly: false, isPath: false });
 | 
			
		||||
    $scope.formValues.Volumes.push({ name: '', containerPath: '' });
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  $scope.removeVolume = function(index) {
 | 
			
		||||
| 
						 | 
				
			
			@ -56,7 +52,12 @@ function ($scope, $state, Config, Container, Image, Volume, Network, Messages, V
 | 
			
		|||
    var swarm = c.swarm;
 | 
			
		||||
 | 
			
		||||
    Volume.query({}, function (d) {
 | 
			
		||||
      $scope.availableVolumes = d.Volumes;
 | 
			
		||||
      var persistedVolumes = d.Volumes.filter(function (volume) {
 | 
			
		||||
        if (volume.Driver === 'local-persist') {
 | 
			
		||||
          return volume;
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
      $scope.availableVolumes = _.uniqBy(persistedVolumes, 'Name');
 | 
			
		||||
    }, function (e) {
 | 
			
		||||
      Messages.error("Failure", e.data);
 | 
			
		||||
    });
 | 
			
		||||
| 
						 | 
				
			
			@ -69,6 +70,7 @@ function ($scope, $state, Config, Container, Image, Volume, Network, Messages, V
 | 
			
		|||
            return network;
 | 
			
		||||
          }
 | 
			
		||||
        });
 | 
			
		||||
        $scope.globalNetworkCount = networks.length;
 | 
			
		||||
        networks.push({Name: "bridge"});
 | 
			
		||||
        networks.push({Name: "host"});
 | 
			
		||||
        networks.push({Name: "none"});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -208,28 +208,22 @@
 | 
			
		|||
              <!-- volumes -->
 | 
			
		||||
              <div class="form-group">
 | 
			
		||||
                <label for="container_volumes" class="col-sm-1 control-label text-left">Volumes</label>
 | 
			
		||||
                <div class="col-sm-11">
 | 
			
		||||
                <div class="col-sm-11" ng-if="availableVolumes.length !== 0">
 | 
			
		||||
                  <span class="label label-default clickable" ng-click="addVolume()">
 | 
			
		||||
                    <i class="fa fa-plus-circle" aria-hidden="true"></i> volume
 | 
			
		||||
                  </span>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="col-sm-11" ng-if="availableVolumes.length === 0" style="margin-top: 5px;">
 | 
			
		||||
                  <span class="small text-muted">You don't have any persistent volumes. Head over the <a ui-sref="volumes">volumes view</a> to create one.</span>
 | 
			
		||||
                </div>
 | 
			
		||||
                <!-- volumes-input-list -->
 | 
			
		||||
                <div class="col-sm-offset-1 col-sm-11 form-inline" style="margin-top: 10px;">
 | 
			
		||||
                  <div ng-repeat="volume in formValues.Volumes" style="margin-top: 2px;">
 | 
			
		||||
                    <div class="input-group col-sm-1 input-group-sm">
 | 
			
		||||
                      <div class="checkbox">
 | 
			
		||||
                        <label>
 | 
			
		||||
                          <input type="checkbox" ng-model="volume.readOnly"> Read-only
 | 
			
		||||
                        </label>
 | 
			
		||||
                      </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="input-group col-sm-5 input-group-sm">
 | 
			
		||||
                      <span class="input-group-addon"><input type="checkbox" ng-model="volume.isPath" ng-click="resetVolumePath($index)">Path</span>
 | 
			
		||||
                      <select class="selectpicker form-control" ng-model="volume.name" ng-if="!volume.isPath">
 | 
			
		||||
                      <select class="selectpicker form-control" ng-model="volume.name">
 | 
			
		||||
                        <option selected disabled hidden value="">Select a volume</option>
 | 
			
		||||
                        <option ng-repeat="vol in availableVolumes" ng-value="vol.Name">{{ vol.Name|truncate:30}}</option>
 | 
			
		||||
                        <option ng-repeat="vol in availableVolumes" ng-value="vol.Name">{{ vol.Name|truncate:50}}</option>
 | 
			
		||||
                      </select>
 | 
			
		||||
                      <input ng-if="volume.isPath" type="text" class="form-control" ng-model="volume.name" placeholder="e.g. /path/on/host">
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="input-group col-sm-5 input-group-sm">
 | 
			
		||||
                      <span class="input-group-addon">container</span>
 | 
			
		||||
| 
						 | 
				
			
			@ -251,6 +245,11 @@
 | 
			
		|||
          <!-- tab-network -->
 | 
			
		||||
          <div class="tab-pane" id="network">
 | 
			
		||||
            <form class="form-horizontal" style="margin-top: 15px;">
 | 
			
		||||
              <div class="form-group" ng-if="globalNetworkCount === 0">
 | 
			
		||||
                <div class="col-sm-12">
 | 
			
		||||
                  <span class="small text-muted">You don't have any shared network. Head over the <a ui-sref="networks">networks view</a> to create one.</span>
 | 
			
		||||
                </div>
 | 
			
		||||
              </div>
 | 
			
		||||
              <!-- network-input -->
 | 
			
		||||
              <div class="form-group">
 | 
			
		||||
                <label for="container_network" class="col-sm-1 control-label text-left">Network</label>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,57 +0,0 @@
 | 
			
		|||
angular.module('createNetwork', [])
 | 
			
		||||
.controller('CreateNetworkController', ['$scope', '$state', 'Messages', 'Network', 'ViewSpinner', 'errorMsgFilter',
 | 
			
		||||
function ($scope, $state, Messages, Network, ViewSpinner, errorMsgFilter) {
 | 
			
		||||
  $scope.formValues = {
 | 
			
		||||
    DriverOptions: []
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  $scope.config = {
 | 
			
		||||
    Driver: 'bridge',
 | 
			
		||||
    CheckDuplicate: true,
 | 
			
		||||
    Internal: false
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  $scope.addDriverOption = function() {
 | 
			
		||||
    $scope.formValues.DriverOptions.push({ name: '', value: '' });
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  $scope.removeDriverOption = function(index) {
 | 
			
		||||
    $scope.formValues.DriverOptions.splice(index, 1);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  function createNetwork(config) {
 | 
			
		||||
    ViewSpinner.spin();
 | 
			
		||||
    Network.create(config, function (d) {
 | 
			
		||||
      if (d.Id) {
 | 
			
		||||
        Messages.send("Network created", d.Id);
 | 
			
		||||
        ViewSpinner.stop();
 | 
			
		||||
        $state.go('networks', {}, {reload: true});
 | 
			
		||||
      } else {
 | 
			
		||||
        ViewSpinner.stop();
 | 
			
		||||
        Messages.error('Unable to create network', errorMsgFilter(d));
 | 
			
		||||
      }
 | 
			
		||||
    }, function (e) {
 | 
			
		||||
      ViewSpinner.stop();
 | 
			
		||||
      Messages.error('Unable to create network', e.data);
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function prepareDriverOptions(config) {
 | 
			
		||||
    var options = {};
 | 
			
		||||
    $scope.formValues.DriverOptions.forEach(function (option) {
 | 
			
		||||
      options[option.name] = option.value;
 | 
			
		||||
    });
 | 
			
		||||
    config.Options = options;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function prepareConfiguration() {
 | 
			
		||||
    var config = angular.copy($scope.config);
 | 
			
		||||
    prepareDriverOptions(config);
 | 
			
		||||
    return config;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  $scope.create = function () {
 | 
			
		||||
    var config = prepareConfiguration();
 | 
			
		||||
    createNetwork(config);
 | 
			
		||||
  };
 | 
			
		||||
}]);
 | 
			
		||||
| 
						 | 
				
			
			@ -1,80 +0,0 @@
 | 
			
		|||
<rd-header>
 | 
			
		||||
  <rd-header-title title="Create network"></rd-header-title>
 | 
			
		||||
  <rd-header-content>
 | 
			
		||||
    Networks > Add network
 | 
			
		||||
  </rd-header-content>
 | 
			
		||||
</rd-header>
 | 
			
		||||
 | 
			
		||||
<div class="row">
 | 
			
		||||
  <div class="col-lg-12 col-md-12 col-xs-12">
 | 
			
		||||
    <rd-widget>
 | 
			
		||||
      <rd-widget-body>
 | 
			
		||||
        <form class="form-horizontal">
 | 
			
		||||
          <!-- name-input -->
 | 
			
		||||
          <div class="form-group">
 | 
			
		||||
            <label for="network_name" class="col-sm-1 control-label text-left">Name</label>
 | 
			
		||||
            <div class="col-sm-11">
 | 
			
		||||
              <input type="text" class="form-control" ng-model="config.Name" id="network_name" placeholder="e.g. myNetwork">
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <!-- !name-input -->
 | 
			
		||||
          <!-- driver-input -->
 | 
			
		||||
          <div class="form-group">
 | 
			
		||||
            <label for="network_driver" class="col-sm-1 control-label text-left">Driver</label>
 | 
			
		||||
            <div class="col-sm-11">
 | 
			
		||||
              <input type="text" class="form-control" ng-model="config.Driver" id="network_driver" placeholder="e.g. driverName">
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <!-- !driver-input -->
 | 
			
		||||
          <!-- driver-options -->
 | 
			
		||||
          <div class="form-group">
 | 
			
		||||
            <label for="network_driveropts" class="col-sm-1 control-label text-left">Driver options</label>
 | 
			
		||||
            <div class="col-sm-11">
 | 
			
		||||
              <span class="label label-default clickable" ng-click="addDriverOption()">
 | 
			
		||||
                <i class="fa fa-plus-circle" aria-hidden="true"></i> driver option
 | 
			
		||||
              </span>
 | 
			
		||||
            </div>
 | 
			
		||||
            <!-- driver-options-input-list -->
 | 
			
		||||
            <div class="col-sm-offset-1 col-sm-11 form-inline" style="margin-top: 10px;">
 | 
			
		||||
              <div ng-repeat="option in formValues.DriverOptions" style="margin-top: 2px;">
 | 
			
		||||
                <div class="input-group col-sm-5 input-group-sm">
 | 
			
		||||
                  <span class="input-group-addon">name</span>
 | 
			
		||||
                  <input type="text" class="form-control" ng-model="option.name" placeholder="e.g. com.docker.network.bridge.enable_icc">
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="input-group col-sm-5 input-group-sm">
 | 
			
		||||
                  <span class="input-group-addon">value</span>
 | 
			
		||||
                  <input type="text" class="form-control" ng-model="option.value" placeholder="e.g. true">
 | 
			
		||||
                  <span class="input-group-btn">
 | 
			
		||||
                    <button class="btn btn-default" type="button" ng-click="removeDriverOption($index)">
 | 
			
		||||
                      <i class="fa fa-minus" aria-hidden="true"></i>
 | 
			
		||||
                    </button>
 | 
			
		||||
                  </span>
 | 
			
		||||
                </div>
 | 
			
		||||
              </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <!-- !driver-options-input-list -->
 | 
			
		||||
          </div>
 | 
			
		||||
          <!-- !driver-options -->
 | 
			
		||||
          <!-- internal -->
 | 
			
		||||
          <div class="form-group">
 | 
			
		||||
            <div class="col-sm-12">
 | 
			
		||||
              <div class="checkbox">
 | 
			
		||||
                <label>
 | 
			
		||||
                  <input type="checkbox" ng-model="config.Internal"> Restrict external access to the network
 | 
			
		||||
                </label>
 | 
			
		||||
              </div>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <!-- !internal -->
 | 
			
		||||
        </form>
 | 
			
		||||
      </rd-widget-body>
 | 
			
		||||
    </rd-widget>
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div class="row">
 | 
			
		||||
  <div class="col-lg-12 col-md-12 col-xs-12" style="text-align: center;">
 | 
			
		||||
    <button type="button" class="btn btn-default btn-lg" ng-click="create()">Create</button>
 | 
			
		||||
    <a type="button" class="btn btn-default btn-lg" ui-sref="networks">Cancel</a>
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,56 +0,0 @@
 | 
			
		|||
angular.module('createVolume', [])
 | 
			
		||||
.controller('CreateVolumeController', ['$scope', '$state', 'Volume', 'Messages', 'ViewSpinner', 'errorMsgFilter',
 | 
			
		||||
function ($scope, $state, Volume, Messages, ViewSpinner, errorMsgFilter) {
 | 
			
		||||
 | 
			
		||||
  $scope.formValues = {
 | 
			
		||||
    DriverOptions: []
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  $scope.config = {
 | 
			
		||||
    Driver: 'local'
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  $scope.addDriverOption = function() {
 | 
			
		||||
    $scope.formValues.DriverOptions.push({ name: '', value: '' });
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  $scope.removeDriverOption = function(index) {
 | 
			
		||||
    $scope.formValues.DriverOptions.splice(index, 1);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  function createVolume(config) {
 | 
			
		||||
    ViewSpinner.spin();
 | 
			
		||||
    Volume.create(config, function (d) {
 | 
			
		||||
      if (d.Name) {
 | 
			
		||||
        Messages.send("Volume created", d.Name);
 | 
			
		||||
        ViewSpinner.stop();
 | 
			
		||||
        $state.go('volumes', {}, {reload: true});
 | 
			
		||||
      } else {
 | 
			
		||||
        ViewSpinner.stop();
 | 
			
		||||
        Messages.error('Unable to create volume', errorMsgFilter(d));
 | 
			
		||||
      }
 | 
			
		||||
    }, function (e) {
 | 
			
		||||
      ViewSpinner.stop();
 | 
			
		||||
      Messages.error('Unable to create volume', e.data);
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function prepareDriverOptions(config) {
 | 
			
		||||
    var options = {};
 | 
			
		||||
    $scope.formValues.DriverOptions.forEach(function (option) {
 | 
			
		||||
      options[option.name] = option.value;
 | 
			
		||||
    });
 | 
			
		||||
    config.DriverOpts = options;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function prepareConfiguration() {
 | 
			
		||||
    var config = angular.copy($scope.config);
 | 
			
		||||
    prepareDriverOptions(config);
 | 
			
		||||
    return config;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  $scope.create = function () {
 | 
			
		||||
    var config = prepareConfiguration();
 | 
			
		||||
    createVolume(config);
 | 
			
		||||
  };
 | 
			
		||||
}]);
 | 
			
		||||
| 
						 | 
				
			
			@ -1,69 +0,0 @@
 | 
			
		|||
<rd-header>
 | 
			
		||||
  <rd-header-title title="Create volume"></rd-header-title>
 | 
			
		||||
  <rd-header-content>
 | 
			
		||||
    Volumes > Add volume
 | 
			
		||||
  </rd-header-content>
 | 
			
		||||
</rd-header>
 | 
			
		||||
 | 
			
		||||
<div class="row">
 | 
			
		||||
  <div class="col-lg-12 col-md-12 col-xs-12">
 | 
			
		||||
    <rd-widget>
 | 
			
		||||
      <rd-widget-body>
 | 
			
		||||
        <form class="form-horizontal">
 | 
			
		||||
          <!-- name-input -->
 | 
			
		||||
          <div class="form-group">
 | 
			
		||||
            <label for="volume_name" class="col-sm-1 control-label text-left">Name</label>
 | 
			
		||||
            <div class="col-sm-11">
 | 
			
		||||
              <input type="text" class="form-control" ng-model="config.Name" id="volume_name" placeholder="e.g. myVolume">
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <!-- !name-input -->
 | 
			
		||||
          <!-- driver-input -->
 | 
			
		||||
          <div class="form-group">
 | 
			
		||||
            <label for="volume_driver" class="col-sm-1 control-label text-left">Driver</label>
 | 
			
		||||
            <div class="col-sm-11">
 | 
			
		||||
              <input type="text" class="form-control" ng-model="config.Driver" id="volume_driver" placeholder="e.g. driverName">
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <!-- !driver-input -->
 | 
			
		||||
          <!-- driver-options -->
 | 
			
		||||
          <div class="form-group">
 | 
			
		||||
            <label for="volume_driveropts" class="col-sm-1 control-label text-left">Driver options</label>
 | 
			
		||||
            <div class="col-sm-11">
 | 
			
		||||
              <span class="label label-default clickable" ng-click="addDriverOption()">
 | 
			
		||||
                <i class="fa fa-plus-circle" aria-hidden="true"></i> driver option
 | 
			
		||||
              </span>
 | 
			
		||||
            </div>
 | 
			
		||||
            <!-- driver-options-input-list -->
 | 
			
		||||
            <div class="col-sm-offset-1 col-sm-11 form-inline" style="margin-top: 10px;">
 | 
			
		||||
              <div ng-repeat="option in formValues.DriverOptions" style="margin-top: 2px;">
 | 
			
		||||
                <div class="input-group col-sm-5 input-group-sm">
 | 
			
		||||
                  <span class="input-group-addon">name</span>
 | 
			
		||||
                  <input type="text" class="form-control" ng-model="option.name" placeholder="e.g. mountpoint">
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="input-group col-sm-5 input-group-sm">
 | 
			
		||||
                  <span class="input-group-addon">value</span>
 | 
			
		||||
                  <input type="text" class="form-control" ng-model="option.value" placeholder="e.g. /path/on/host">
 | 
			
		||||
                  <span class="input-group-btn">
 | 
			
		||||
                    <button class="btn btn-default" type="button" ng-click="removeDriverOption($index)">
 | 
			
		||||
                      <i class="fa fa-minus" aria-hidden="true"></i>
 | 
			
		||||
                    </button>
 | 
			
		||||
                  </span>
 | 
			
		||||
                </div>
 | 
			
		||||
              </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <!-- !driver-options-input-list -->
 | 
			
		||||
          </div>
 | 
			
		||||
          <!-- !driver-options -->
 | 
			
		||||
        </form>
 | 
			
		||||
      </rd-widget-body>
 | 
			
		||||
    </rd-widget>
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div class="row">
 | 
			
		||||
  <div class="col-lg-12 col-md-12 col-xs-12" style="text-align: center;">
 | 
			
		||||
    <button type="button" class="btn btn-default btn-lg" ng-click="create()">Create</button>
 | 
			
		||||
    <a type="button" class="btn btn-default btn-lg" ui-sref="volumes">Cancel</a>
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
| 
						 | 
				
			
			@ -76,18 +76,11 @@
 | 
			
		|||
                </th>
 | 
			
		||||
                <th>
 | 
			
		||||
                  <a ui-sref="images" ng-click="order('VirtualSize')">
 | 
			
		||||
                    VirtualSize
 | 
			
		||||
                    Size
 | 
			
		||||
                    <span ng-show="sortType == 'VirtualSize' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>
 | 
			
		||||
                    <span ng-show="sortType == 'VirtualSize' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>
 | 
			
		||||
                  </a>
 | 
			
		||||
                </th>
 | 
			
		||||
                <th>
 | 
			
		||||
                  <a ui-sref="images" ng-click="order('Created')">
 | 
			
		||||
                    Created
 | 
			
		||||
                    <span ng-show="sortType == 'Created' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>
 | 
			
		||||
                    <span ng-show="sortType == 'Created' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>
 | 
			
		||||
                  </a>
 | 
			
		||||
                </th>
 | 
			
		||||
              </tr>
 | 
			
		||||
            </thead>
 | 
			
		||||
            <tbody>
 | 
			
		||||
| 
						 | 
				
			
			@ -96,7 +89,6 @@
 | 
			
		|||
                <td><a ui-sref="image({id: image.Id})">{{ image.Id|truncate:20}}</a></td>
 | 
			
		||||
                <td>{{ image|repotag }}</td>
 | 
			
		||||
                <td>{{ image.VirtualSize|humansize }}</td>
 | 
			
		||||
                <td>{{ image.Created|getdate }}</td>
 | 
			
		||||
              </tr>
 | 
			
		||||
            </tbody>
 | 
			
		||||
          </table>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@ angular.module('images', [])
 | 
			
		|||
.controller('ImagesController', ['$scope', '$state', 'Image', 'ViewSpinner', 'Messages',
 | 
			
		||||
function ($scope, $state, Image, ViewSpinner, Messages) {
 | 
			
		||||
  $scope.state = {};
 | 
			
		||||
  $scope.sortType = 'Created';
 | 
			
		||||
  $scope.sortType = 'RepoTags';
 | 
			
		||||
  $scope.sortReverse = true;
 | 
			
		||||
  $scope.state.toggle = false;
 | 
			
		||||
  $scope.state.selectedItemCount = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,6 +7,39 @@
 | 
			
		|||
  <rd-header-content>Networks</rd-header-content>
 | 
			
		||||
</rd-header>
 | 
			
		||||
 | 
			
		||||
<div class="row">
 | 
			
		||||
  <div class="col-lg-12 col-md-12 col-xs-12">
 | 
			
		||||
    <rd-widget>
 | 
			
		||||
      <rd-widget-header icon="fa-plus" title="Add a shared network">
 | 
			
		||||
      </rd-widget-header>
 | 
			
		||||
      <rd-widget-body>
 | 
			
		||||
        <form class="form-horizontal">
 | 
			
		||||
          <!-- name-input -->
 | 
			
		||||
          <div class="form-group">
 | 
			
		||||
            <label for="network_name" class="col-sm-1 control-label text-left">Name</label>
 | 
			
		||||
            <div class="col-sm-11">
 | 
			
		||||
              <input type="text" class="form-control" ng-model="config.Name" id="network_name" placeholder="e.g. myNetwork">
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <!-- !name-input -->
 | 
			
		||||
          <!-- tag-note -->
 | 
			
		||||
          <div class="form-group">
 | 
			
		||||
            <div class="col-sm-12">
 | 
			
		||||
              <span class="small text-muted">Note: The network will be created using the overlay driver and will allow containers to communicate across the hosts of your cluster.</span>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <!-- !tag-note -->
 | 
			
		||||
          <div class="form-group">
 | 
			
		||||
            <div class="col-sm-12">
 | 
			
		||||
              <button type="button" class="btn btn-default btn-sm" ng-disabled="!config.Name" ng-click="createNetwork()">Create</button>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </form>
 | 
			
		||||
      </rd-widget-body>
 | 
			
		||||
    </rd-widget>
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div class="col-lg-12">
 | 
			
		||||
  <rd-widget>
 | 
			
		||||
    <rd-widget-header icon="fa-sitemap" title="Networks">
 | 
			
		||||
| 
						 | 
				
			
			@ -14,7 +47,6 @@
 | 
			
		|||
    <rd-widget-taskbar classes="col-lg-12">
 | 
			
		||||
      <div class="pull-left">
 | 
			
		||||
        <button type="button" class="btn btn-danger" ng-click="removeAction()" ng-disabled="!state.selectedItemCount">Remove</button>
 | 
			
		||||
        <a class="btn btn-default" type="button" ui-sref="actions.create.network">Add network</a>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="pull-right">
 | 
			
		||||
        <input type="text" id="filter" ng-model="state.filter" placeholder="Filter..." class="form-control input-sm" />
 | 
			
		||||
| 
						 | 
				
			
			@ -33,13 +65,6 @@
 | 
			
		|||
                  <span ng-show="sortType == 'Name' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>
 | 
			
		||||
                </a>
 | 
			
		||||
              </th>
 | 
			
		||||
              <th>
 | 
			
		||||
                <a ui-sref="networks" ng-click="order('Id')">
 | 
			
		||||
                  Id
 | 
			
		||||
                  <span ng-show="sortType == 'Id' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>
 | 
			
		||||
                  <span ng-show="sortType == 'Id' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>
 | 
			
		||||
                </a>
 | 
			
		||||
              </th>
 | 
			
		||||
              <th>
 | 
			
		||||
                <a ui-sref="networks" ng-click="order('Scope')">
 | 
			
		||||
                  Scope
 | 
			
		||||
| 
						 | 
				
			
			@ -47,30 +72,16 @@
 | 
			
		|||
                  <span ng-show="sortType == 'Scope' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>
 | 
			
		||||
                </a>
 | 
			
		||||
              </th>
 | 
			
		||||
              <th>
 | 
			
		||||
                <a ui-sref="networks" ng-click="order('Driver')">
 | 
			
		||||
                  Driver
 | 
			
		||||
                  <span ng-show="sortType == 'Driver' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>
 | 
			
		||||
                  <span ng-show="sortType == 'Driver' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>
 | 
			
		||||
                </a>
 | 
			
		||||
              </th>
 | 
			
		||||
              <th>
 | 
			
		||||
                <a ui-sref="networks" ng-click="order('IPAM.Driver')">
 | 
			
		||||
                  IPAM Driver
 | 
			
		||||
                  <span ng-show="sortType == 'IPAM.Driver' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>
 | 
			
		||||
                  <span ng-show="sortType == 'IPAM.Driver' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>
 | 
			
		||||
                </a>
 | 
			
		||||
              </th>
 | 
			
		||||
              <th>
 | 
			
		||||
                <a ui-sref="networks" ng-click="order('IPAM.Config[0].Subnet')">
 | 
			
		||||
                  IPAM Subnet
 | 
			
		||||
                  Subnet
 | 
			
		||||
                  <span ng-show="sortType == 'IPAM.Config[0].Subnet' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>
 | 
			
		||||
                  <span ng-show="sortType == 'IPAM.Config[0].Subnet' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>
 | 
			
		||||
                </a>
 | 
			
		||||
              </th>
 | 
			
		||||
              <th>
 | 
			
		||||
                <a ui-sref="networks" ng-click="order('IPAM.Config[0].Gateway')">
 | 
			
		||||
                  IPAM Gateway
 | 
			
		||||
                  Gateway
 | 
			
		||||
                  <span ng-show="sortType == 'IPAM.Config[0].Gateway' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>
 | 
			
		||||
                  <span ng-show="sortType == 'IPAM.Config[0].Gateway' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>
 | 
			
		||||
                </a>
 | 
			
		||||
| 
						 | 
				
			
			@ -80,13 +91,10 @@
 | 
			
		|||
          <tbody>
 | 
			
		||||
            <tr ng-repeat="network in ( state.filteredNetworks = (networks | filter:state.filter | orderBy:sortType:sortReverse))">
 | 
			
		||||
              <td><input type="checkbox" ng-model="network.Checked" ng-change="selectItem(network)"/></td>
 | 
			
		||||
              <td><a ui-sref="network({id: network.Id})">{{ network.Name|truncate:20}}</a></td>
 | 
			
		||||
              <td>{{ network.Id }}</td>
 | 
			
		||||
              <td><a ui-sref="network({id: network.Id})">{{ network.Name|truncate:40}}</a></td>
 | 
			
		||||
              <td>{{ network.Scope }}</td>
 | 
			
		||||
              <td>{{ network.Driver }}</td>
 | 
			
		||||
              <td>{{ network.IPAM.Driver }}</td>
 | 
			
		||||
              <td>{{ network.IPAM.Config[0].Subnet }}</td>
 | 
			
		||||
              <td>{{ network.IPAM.Config[0].Gateway }}</td>
 | 
			
		||||
              <td>{{ network.IPAM.Config[0].Subnet ? network.IPAM.Config[0].Subnet : '-' }}</td>
 | 
			
		||||
              <td>{{ network.IPAM.Config[0].Gateway ? network.IPAM.Config[0].Gateway : '-' }}</td>
 | 
			
		||||
            </tr>
 | 
			
		||||
          </tbody>
 | 
			
		||||
        </table>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +1,15 @@
 | 
			
		|||
angular.module('networks', [])
 | 
			
		||||
.controller('NetworksController', ['$scope', 'Network', 'ViewSpinner', 'Messages', 'errorMsgFilter',
 | 
			
		||||
function ($scope, Network, ViewSpinner, Messages, errorMsgFilter) {
 | 
			
		||||
 | 
			
		||||
.controller('NetworksController', ['$scope', '$state', 'Network', 'ViewSpinner', 'Messages', 'errorMsgFilter',
 | 
			
		||||
function ($scope, $state, Network, ViewSpinner, Messages, errorMsgFilter) {
 | 
			
		||||
  $scope.state = {};
 | 
			
		||||
  $scope.state.toggle = false;
 | 
			
		||||
  $scope.state.selectedItemCount = 0;
 | 
			
		||||
  $scope.sortType = 'Name';
 | 
			
		||||
  $scope.sortReverse = true;
 | 
			
		||||
  $scope.sortType = 'Scope';
 | 
			
		||||
  $scope.sortReverse = false;
 | 
			
		||||
 | 
			
		||||
  $scope.config = {
 | 
			
		||||
    Name: ''
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  $scope.order = function(sortType) {
 | 
			
		||||
    $scope.sortReverse = ($scope.sortType === sortType) ? !$scope.sortReverse : false;
 | 
			
		||||
| 
						 | 
				
			
			@ -32,6 +35,30 @@ function ($scope, Network, ViewSpinner, Messages, errorMsgFilter) {
 | 
			
		|||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  function prepareNetworkConfiguration() {
 | 
			
		||||
    var config = angular.copy($scope.config);
 | 
			
		||||
    config.Driver = 'overlay';
 | 
			
		||||
    return config;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  $scope.createNetwork = function() {
 | 
			
		||||
    ViewSpinner.spin();
 | 
			
		||||
    var config = prepareNetworkConfiguration();
 | 
			
		||||
    Network.create(config, function (d) {
 | 
			
		||||
      if (d.Id) {
 | 
			
		||||
        Messages.send("Network created", d.Id);
 | 
			
		||||
        ViewSpinner.stop();
 | 
			
		||||
        $state.go('networks', {}, {reload: true});
 | 
			
		||||
      } else {
 | 
			
		||||
        ViewSpinner.stop();
 | 
			
		||||
        Messages.error('Unable to create network', errorMsgFilter(d));
 | 
			
		||||
      }
 | 
			
		||||
    }, function (e) {
 | 
			
		||||
      ViewSpinner.stop();
 | 
			
		||||
      Messages.error('Unable to create network', e.data);
 | 
			
		||||
    });
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  $scope.removeAction = function () {
 | 
			
		||||
    ViewSpinner.spin();
 | 
			
		||||
    var counter = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,6 +7,39 @@
 | 
			
		|||
  <rd-header-content>Volumes</rd-header-content>
 | 
			
		||||
</rd-header>
 | 
			
		||||
 | 
			
		||||
<div class="row">
 | 
			
		||||
  <div class="col-lg-12 col-md-12 col-xs-12">
 | 
			
		||||
    <rd-widget>
 | 
			
		||||
      <rd-widget-header icon="fa-plus" title="Add a persistent volume">
 | 
			
		||||
      </rd-widget-header>
 | 
			
		||||
      <rd-widget-body>
 | 
			
		||||
        <form class="form-horizontal">
 | 
			
		||||
          <!-- name-input -->
 | 
			
		||||
          <div class="form-group">
 | 
			
		||||
            <label for="volume_name" class="col-sm-1 control-label text-left">Name</label>
 | 
			
		||||
            <div class="col-sm-11">
 | 
			
		||||
              <input type="text" class="form-control" ng-model="config.Name" id="volume_name" placeholder="e.g. mysql-data">
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <!-- !name-input -->
 | 
			
		||||
          <!-- tag-note -->
 | 
			
		||||
          <div class="form-group">
 | 
			
		||||
            <div class="col-sm-12">
 | 
			
		||||
              <span class="small text-muted">Note: The volume will be created in our persisted storage and will be available across all the hosts of your cluster.</span>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <!-- !tag-note -->
 | 
			
		||||
          <div class="form-group">
 | 
			
		||||
            <div class="col-sm-12">
 | 
			
		||||
              <button type="button" class="btn btn-default btn-sm" ng-disabled="!config.Name" ng-click="createVolume()">Create</button>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </form>
 | 
			
		||||
      </rd-widget-body>
 | 
			
		||||
    </rd-widget>
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div class="col-lg-12">
 | 
			
		||||
  <rd-widget>
 | 
			
		||||
    <rd-widget-header icon="fa-cubes" title="Volumes">
 | 
			
		||||
| 
						 | 
				
			
			@ -14,7 +47,6 @@
 | 
			
		|||
    <rd-widget-taskbar classes="col-lg-12">
 | 
			
		||||
      <div class="pull-left">
 | 
			
		||||
        <button type="button" class="btn btn-danger" ng-click="removeAction()" ng-disabled="!state.selectedItemCount">Remove</button>
 | 
			
		||||
        <a class="btn btn-default" type="button" ui-sref="actions.create.volume">Add volume</a>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="pull-right">
 | 
			
		||||
        <input type="text" id="filter" ng-model="state.filter" placeholder="Filter..." class="form-control input-sm" />
 | 
			
		||||
| 
						 | 
				
			
			@ -40,21 +72,13 @@
 | 
			
		|||
                  <span ng-show="sortType == 'Driver' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>
 | 
			
		||||
                </a>
 | 
			
		||||
              </th>
 | 
			
		||||
              <th>
 | 
			
		||||
                <a ui-sref="volumes" ng-click="order('Mountpoint')">
 | 
			
		||||
                  Mountpoint
 | 
			
		||||
                  <span ng-show="sortType == 'Mountpoint' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span>
 | 
			
		||||
                  <span ng-show="sortType == 'Mountpoint' && sortReverse" class="glyphicon glyphicon-chevron-up"></span>
 | 
			
		||||
                </a>
 | 
			
		||||
              </th>
 | 
			
		||||
            </tr>
 | 
			
		||||
          </thead>
 | 
			
		||||
          <tbody>
 | 
			
		||||
            <tr ng-repeat="volume in (state.filteredVolumes = (volumes | filter:state.filter | orderBy:sortType:sortReverse))">
 | 
			
		||||
              <td><input type="checkbox" ng-model="volume.Checked" ng-change="selectItem(volume)"/></td>
 | 
			
		||||
              <td>{{ volume.Name|truncate:20 }}</td>
 | 
			
		||||
              <td>{{ volume.Name|truncate:50 }}</td>
 | 
			
		||||
              <td>{{ volume.Driver }}</td>
 | 
			
		||||
              <td>{{ volume.Mountpoint }}</td>
 | 
			
		||||
            </tr>
 | 
			
		||||
          </tbody>
 | 
			
		||||
        </table>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +1,16 @@
 | 
			
		|||
angular.module('volumes', [])
 | 
			
		||||
.controller('VolumesController', ['$scope', 'Volume', 'ViewSpinner', 'Messages', 'errorMsgFilter',
 | 
			
		||||
function ($scope, Volume, ViewSpinner, Messages, errorMsgFilter) {
 | 
			
		||||
.controller('VolumesController', ['$scope', '$state', 'Volume', 'ViewSpinner', 'Messages', 'errorMsgFilter',
 | 
			
		||||
function ($scope, $state, Volume, ViewSpinner, Messages, errorMsgFilter) {
 | 
			
		||||
  $scope.state = {};
 | 
			
		||||
  $scope.state.toggle = false;
 | 
			
		||||
  $scope.state.selectedItemCount = 0;
 | 
			
		||||
  $scope.sortType = 'Name';
 | 
			
		||||
  $scope.sortType = 'Driver';
 | 
			
		||||
  $scope.sortReverse = true;
 | 
			
		||||
 | 
			
		||||
  $scope.config = {
 | 
			
		||||
    Name: ''
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  $scope.order = function(sortType) {
 | 
			
		||||
    $scope.sortReverse = ($scope.sortType === sortType) ? !$scope.sortReverse : false;
 | 
			
		||||
    $scope.sortType = sortType;
 | 
			
		||||
| 
						 | 
				
			
			@ -31,6 +35,32 @@ function ($scope, Volume, ViewSpinner, Messages, errorMsgFilter) {
 | 
			
		|||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  function prepareVolumeConfiguration() {
 | 
			
		||||
    var config = angular.copy($scope.config);
 | 
			
		||||
    config.Driver = 'local-persist';
 | 
			
		||||
    config.DriverOpts = {};
 | 
			
		||||
    config.DriverOpts.mountpoint = '/volume/' + config.Name;
 | 
			
		||||
    return config;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  $scope.createVolume = function() {
 | 
			
		||||
    ViewSpinner.spin();
 | 
			
		||||
    var config = prepareVolumeConfiguration();
 | 
			
		||||
    Volume.create(config, function (d) {
 | 
			
		||||
      if (d.Name) {
 | 
			
		||||
        Messages.send("Volume created", d.Name);
 | 
			
		||||
        ViewSpinner.stop();
 | 
			
		||||
        $state.go('volumes', {}, {reload: true});
 | 
			
		||||
      } else {
 | 
			
		||||
        ViewSpinner.stop();
 | 
			
		||||
        Messages.error('Unable to create volume', errorMsgFilter(d));
 | 
			
		||||
      }
 | 
			
		||||
    }, function (e) {
 | 
			
		||||
      ViewSpinner.stop();
 | 
			
		||||
      Messages.error('Unable to create volume', e.data);
 | 
			
		||||
    });
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  $scope.removeAction = function () {
 | 
			
		||||
    ViewSpinner.spin();
 | 
			
		||||
    var counter = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -59,7 +89,7 @@ function ($scope, Volume, ViewSpinner, Messages, errorMsgFilter) {
 | 
			
		|||
  function fetchVolumes() {
 | 
			
		||||
    ViewSpinner.spin();
 | 
			
		||||
    Volume.query({}, function (d) {
 | 
			
		||||
      $scope.volumes = d.Volumes;
 | 
			
		||||
      $scope.volumes = _.uniqBy(d.Volumes, 'Name');
 | 
			
		||||
      ViewSpinner.stop();
 | 
			
		||||
    }, function (e) {
 | 
			
		||||
      Messages.error("Failure", e.data);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -268,7 +268,7 @@ module.exports = function (grunt) {
 | 
			
		|||
                command: [
 | 
			
		||||
                    'docker stop ui-for-docker',
 | 
			
		||||
                    'docker rm ui-for-docker',
 | 
			
		||||
                    'docker run --privileged -d -p 9000:9000 -v /tmp/docker-ui:/data --name ui-for-docker ui-for-docker -e http://10.0.7.10:4000 --swarm -d /data'
 | 
			
		||||
                    'docker run --privileged -d -p 9000:9000 -v /tmp/docker-ui:/data --name ui-for-docker ui-for-docker -e http://10.0.7.11:4000 --swarm -d /data'
 | 
			
		||||
                ].join(';')
 | 
			
		||||
            },
 | 
			
		||||
            cleanImages: {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue