Commit 93a6e237 by Sulyok Gábor

Removed unneccesary file, added relation & attribute checks for

deployment in setty
parent f9aa89de
...@@ -5,196 +5,217 @@ from django.db.models.loading import get_model ...@@ -5,196 +5,217 @@ from django.db.models.loading import get_model
from django.db import transaction from django.db import transaction
from saltstackhelper import * from saltstackhelper import *
import os import os
from vm.models import Instance
class SettyController: class SettyController:
@staticmethod @staticmethod
@transaction.atomic @transaction.atomic
def saveService( serviceId, serviceName, serviceNodes, machines, elementConnections ): def saveService(serviceId, serviceName, serviceNodes, machines, elementConnections):
service = None service = None
try: try:
service = Service.objects.get(id=serviceId) service = Service.objects.get(id=serviceId)
except Service.DoesNotExist: except Service.DoesNotExist:
return JsonResponse( {'error': 'Service not found'}) return JsonResponse({'error': 'Service not found'})
service.name = serviceName service.name = serviceName
service.save() service.save()
Machine.objects.filter(service=service).delete() Machine.objects.filter(service=service).delete()
for machineData in machines: for machineData in machines:
machineSaved = Machine(service=service) machineSaved = Machine(service=service)
machineSaved.fromDataDictionary( machineData ) machineSaved.fromDataDictionary(machineData)
machineSaved.save() machineSaved.save()
ServiceNode.objects.filter(service=service).delete() ServiceNode.objects.filter(service=service).delete()
for node in serviceNodes: for node in serviceNodes:
elementTemplateId = node["displayId"].split("_")[1] elementTemplateId = node["displayId"].split("_")[1]
elementTemplate = ElementTemplate.objects.get(id=elementTemplateId) elementTemplate = ElementTemplate.objects.get(id=elementTemplateId)
newNode = get_model('setty', elementTemplate.prototype ).clone() newNode = get_model('setty', elementTemplate.prototype).clone()
newNode.service = service newNode.service = service
newNode.fromDataDictionary( node ) newNode.fromDataDictionary(node)
newNode.save() newNode.save()
for elementConnection in elementConnections: for elementConnection in elementConnections:
sourceId = elementConnection['sourceId'] sourceId = elementConnection['sourceId']
targetId = elementConnection['targetId'] targetId = elementConnection['targetId']
sourceEndpoint = elementConnection['sourceEndpoint'] sourceEndpoint = elementConnection['sourceEndpoint']
targetEndpoint = elementConnection['targetEndpoint'] targetEndpoint = elementConnection['targetEndpoint']
targetObject = Element.objects.get( targetObject = Element.objects.get(
display_id=targetId) display_id=targetId)
sourceObject = Element.objects.get( sourceObject = Element.objects.get(
display_id=sourceId) display_id=sourceId)
connectionObject = ElementConnection( connectionObject = ElementConnection(
target=targetObject, target=targetObject,
source=sourceObject, source=sourceObject,
target_endpoint=targetEndpoint, target_endpoint=targetEndpoint,
source_endpoint=sourceEndpoint source_endpoint=sourceEndpoint
) )
connectionObject.save() connectionObject.save()
return {"serviceName": serviceName} return {"serviceName": serviceName}
@staticmethod @staticmethod
def loadService(serviceId): def loadService(serviceId):
service = None service = None
try:
service = Service.objects.get(id=serviceId) try:
except Service.DoesNotExist: service = Service.objects.get(id=serviceId)
return JsonResponse({'error': 'Service not found'}) except Service.DoesNotExist:
return JsonResponse({'error': 'Service not found'})
machineList = Machine.objects.filter(service=service)
serviceNodes = [] machineList = Machine.objects.filter(service=service)
elementConnections = [] serviceNodes = []
machines = [] elementConnections = []
machines = []
for machine in machineList:
machines.append(machine.getDataDictionary()) for machine in machineList:
machines.append(machine.getDataDictionary())
serviveNodeList = ServiceNode.objects.filter(service=service)
elementConnectionList = ElementConnection.objects.filter( serviveNodeList = ServiceNode.objects.filter(service=service)
Q(target__in=serviveNodeList) | Q(source__in=serviveNodeList)) elementConnectionList = ElementConnection.objects.filter(
Q(target__in=serviveNodeList) | Q(source__in=serviveNodeList))
for servideNode in serviveNodeList:
serviceNodes.append( servideNode.cast().getDataDictionary() ) for servideNode in serviveNodeList:
serviceNodes.append(servideNode.cast().getDataDictionary())
for elementConnection in elementConnectionList:
elementConnections.append( elementConnection.getDataDictionary() ) for elementConnection in elementConnectionList:
elementConnections.append(elementConnection.getDataDictionary())
return {'serviceName': service.name,
'elementConnections': elementConnections, return {'serviceName': service.name,
'serviceNodes': serviceNodes, 'elementConnections': elementConnections,
'machines': machines} 'serviceNodes': serviceNodes,
'machines': machines}
@staticmethod
def getInformation(elementTemplateId, hostname): @staticmethod
if elementTemplateId: def getInformation(elementTemplateId, hostname):
try: if elementTemplateId:
elementTemplate = ElementTemplate.objects.get( try:
id=elementTemplateId) elementTemplate = ElementTemplate.objects.get(
model = get_model('setty', elementTemplate.prototype) id=elementTemplateId)
return model.getInformation() model = get_model('setty', elementTemplate.prototype)
except ElementTemplate.DoesNotExist: return model.getInformation()
return except ElementTemplate.DoesNotExist:
except LookupError: return
return except LookupError:
elif hostname: return
return Machine.getInformation() elif hostname:
elif hostname and elementTemplateId: return Machine.getInformation()
raise PermissionDenied # TODO: something more meaningful elif hostname and elementTemplateId:
else: raise PermissionDenied # TODO: something more meaningful
raise PermissionDenied # TODO: something more meaningful else:
raise PermissionDenied # TODO: something more meaningful
@staticmethod
def getMachineAvailableList(service_id, used_hostnames): @staticmethod
all_minions = SettyController.salthelper.getAllMinionsGrouped() def getMachineAvailableList(serviceId, used_hostnames, current_user):
result = [] all_minions = SettyController.salthelper.getAllMinionsUngrouped()
#TODO: filter out used ones usedMachines = Machine.objects.get(service=serviceId)
for item in all_minions["up"]: user_instances = Instance.objects.get(owner=current_user)
result.append( {'hostname': item,
'hardware-info': SettyController.salthelper.getMinionBasicHardwareInfo( item ), userMachines = []
'status': 'up'} ) for instance in user_instances:
if user_instances.vm_name():
for item in all_minions["down"]: userMachines.append(user_instances.vm_name())
result.append( {'hostname': item, 'status': 'down' })
result = []
return { 'machinedata': result } for machine in usedMachines:
if machine.hostname not in userMachines:
@staticmethod result.append(machine.hostname)
def addMachine(hostname):
try: return {'machinedata': result}
Machine.objects.get(hostname=hostname)
return {'error': 'already added or doesnt exists'} @staticmethod
except: def addMachine(hostname):
pass try:
if SettyController.salthelper.checkMinionExists(hostname): Machine.objects.get(hostname=hostname)
machine = Machine.clone() return {'error': 'already added or doesnt exists'}
machine.hostname = hostname except:
return machine.getDataDictionary() pass
else: if SettyController.salthelper.checkMinionExists(hostname):
return {'error': 'already added or doesnt exists'} machine = Machine.clone()
machine.hostname = hostname
@staticmethod return machine.getDataDictionary()
def addServiceNode(elementTemplateId): else:
if elementTemplateId: return {'error': 'already added or doesnt exists'}
try:
elementTemplate = ElementTemplate.objects.get(id=elementTemplateId) @staticmethod
model = get_model('setty', elementTemplate.prototype ) def addServiceNode(elementTemplateId):
return model.clone().getDataDictionary() if elementTemplateId:
except ElementTemplate.DoesNotExist: try:
return {'error': "ElementTemplate doesn't exists" } elementTemplate = ElementTemplate.objects.get(
except: id=elementTemplateId)
return {'error': 'Can not get prototype'} model = get_model('setty', elementTemplate.prototype)
else: return model.clone().getDataDictionary()
return {'error': 'templateid'} except ElementTemplate.DoesNotExist:
return {'error': "ElementTemplate doesn't exists"}
@staticmethod except:
def deploy(serviceId): return {'error': 'Can not get prototype'}
service = Service.objects.get(id=serviceId) else:
machines = Machine.objects.filter(service=service) return {'error': 'templateid'}
elementConnections = ElementConnection.objects.filter(
Q(target__in=machines) | Q(source__in=machines) ) @staticmethod
def deploy(serviceId):
firstLevelServiceNodes = [] service = Service.objects.get(id=serviceId)
#phase one: set the machine ptr in serviceNodes which can be accessed by machines = Machine.objects.filter(service=service)
# connections from machines
for machine in machines: serviveNodeList = ServiceNode.objects.filter(service=service)
for connection in elementConnections: errorMessages = []
serviceNode = None for serviceNode in serviveNodeList:
if connection.target.cast() == machine: errorMessage = serviceNode.cast().checkDependenciesAndAttributes()
serviceNode = connection.source.cast() if errorMessage:
serviceNode.setMachineForDeploy( machine ) errorMessages.append(errorMessage)
elif connection.source.cast() == machine: if errorMessages:
serviceNode = connection.target.cast() return {'status': 'error',
serviceNode.setMachineForDeploy( machine ) 'errors': errorMessages }
else:
raise PermissionDenied elementConnections = ElementConnection.objects.filter(
firstLevelServiceNodes.append( serviceNode ) Q(target__in=machines) | Q(source__in=machines))
firstLevelServiceNodes = []
#phase two: let the nodes create configurations recursively
configuratedNodes = list() # phase one: set the machine ptr in serviceNodes which can be accessed by
for serviceNode in firstLevelServiceNodes: # connections from machines
generatedNodes = serviceNode.generateConfigurationRecursively() for machine in machines:
if isinstance( generatedNodes, list ): for connection in elementConnections:
configuratedNodes = configuratedNodes + generatedNodes serviceNode = None
else: if connection.target.cast() == machine:
configuratedNodes.append( generatedNodes ) serviceNode = connection.source.cast()
serviceNode.setMachineForDeploy(machine)
#phase three: sort the nodes by deployment priority(lower the prio, later in the deployement)
elif connection.source.cast() == machine:
configuratedNodes.sort(reverse=True) serviceNode = connection.target.cast()
serviceNode.setMachineForDeploy(machine)
#deploy the nodes else:
for node in configuratedNodes: raise PermissionDenied
SettyController.salthelper.deploy( node.machine.hostname, node.generatedConfig ) firstLevelServiceNodes.append(serviceNode)
return {'status': 'deployed'}
# phase two: let the nodes create configurations recursively
#cleanup the temporary data configuratedNodes = list()
''' for node in configuratedNodes: for serviceNode in firstLevelServiceNodes:
node.deployCleanUp()''' generatedNodes = serviceNode.generateConfigurationRecursively()
if isinstance(generatedNodes, list):
configuratedNodes = configuratedNodes + generatedNodes
else:
configuratedNodes.append(generatedNodes)
# phase three: sort the nodes by deployment priority(lower the prio,
# later in the deployement)
configuratedNodes.sort(reverse=True)
return {'status': 'success'}
# deploy the nodes
# for node in configuratedNodes:
# SettyController.salthelper.deploy(
# node.machine.hostname, node.generatedConfig)
# return {'status': 'deployed'}
# cleanup the temporary data
''' for node in configuratedNodes:
node.deployCleanUp()'''
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('setty', '0021_element_real_type'),
]
\ No newline at end of file
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('setty', '0023_drop_parameters_from_elementconnection'),
]
operations = [
migrations.CreateModel(
name='ApacheNode',
fields=[
('webservernode_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='setty.WebServerNode')),
],
options={
'abstract': False,
},
bases=('setty.webservernode',),
),
migrations.CreateModel(
name='WordpressNode',
fields=[
('servicenode_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='setty.ServiceNode')),
('databaseListeningPort', models.PositiveIntegerField()),
('databaseHost', models.TextField()),
('databaseUser', models.TextField()),
('databasePass', models.TextField()),
('adminUsername', models.TextField()),
('adminPassword', models.TextField()),
('adminEmail', models.TextField()),
('siteTitle', models.TextField()),
('siteUrl', models.TextField()),
],
options={
'abstract': False,
},
bases=('setty.servicenode',),
),
migrations.RemoveField(
model_name='machine',
name='config_file',
),
]
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
# with CIRCLE. If not, see <http://www.gnu.org/licenses/>. # with CIRCLE. If not, see <http://www.gnu.org/licenses/>.
from django.db import models from django.db import models
from django.db.models import Model from django.db.models import Model, Q
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import User from django.contrib.auth.models import User
from taggit.managers import TaggableManager from taggit.managers import TaggableManager
...@@ -29,6 +29,7 @@ import os ...@@ -29,6 +29,7 @@ import os
SALTSTACK_STATE_FOLDER = "/srv/salt" SALTSTACK_STATE_FOLDER = "/srv/salt"
def replaceParameter(config, parameterToReplace, newValue): def replaceParameter(config, parameterToReplace, newValue):
configEdited = config.replace(parameterToReplace, str(newValue)) configEdited = config.replace(parameterToReplace, str(newValue))
return configEdited return configEdited
...@@ -55,6 +56,9 @@ class ElementCategory(models.Model): ...@@ -55,6 +56,9 @@ class ElementCategory(models.Model):
def __unicode__(self): def __unicode__(self):
return self.name return self.name
# Defines a model for ElementTemplates which are used to create real elements on the GUI
# Hold
class ElementTemplate(models.Model): class ElementTemplate(models.Model):
name = models.CharField(max_length=50) name = models.CharField(max_length=50)
...@@ -128,7 +132,7 @@ class ElementConnection(models.Model): ...@@ -128,7 +132,7 @@ class ElementConnection(models.Model):
def getDataDictionary(self): def getDataDictionary(self):
return {'targetEndpoint': self.target_endpoint, return {'targetEndpoint': self.target_endpoint,
'sourceEndpoint': self.source_endpoint } 'sourceEndpoint': self.source_endpoint}
class Machine(Element): # As a real machine class Machine(Element): # As a real machine
...@@ -140,7 +144,6 @@ class Machine(Element): # As a real machine ...@@ -140,7 +144,6 @@ class Machine(Element): # As a real machine
Service, on_delete=models.CASCADE, related_name="service_id") Service, on_delete=models.CASCADE, related_name="service_id")
hostname = models.TextField(null=False) # also serves as salt-minion id hostname = models.TextField(null=False) # also serves as salt-minion id
alias = models.CharField(max_length=50) alias = models.CharField(max_length=50)
#config_file = models.FileField(default=None,upload_to='setty/machine_configs/', storage=OverwriteStorage())
description = models.TextField(default="") description = models.TextField(default="")
status = models.CharField(choices=MACHINE_STATUS_CHOICES, max_length=1) status = models.CharField(choices=MACHINE_STATUS_CHOICES, max_length=1)
...@@ -210,6 +213,23 @@ class ServiceNode(Element): ...@@ -210,6 +213,23 @@ class ServiceNode(Element):
def clone(): def clone():
raise PermissionDenied raise PermissionDenied
def checkDependenciesAndAttributes(self):
return []
def checkDependecy(self, ObjOther):
elementConnections = ElementConnection.objects.filter(
Q(target=self) | Q(source=self))
for connection in elementConnections:
serviceNode = None
if connection.target.cast() == self:
if isinstance(connection.source.cast(), ObjOther):
return True
elif connection.source.cast() == self:
if isinstance(connection.target.cast(), ObjOther):
return True
return False
def __cmp__(self, other): def __cmp__(self, other):
return self.getDeploymentPriority(self).__cmp__(other.getDeploymentPriority(other)) return self.getDeploymentPriority(self).__cmp__(other.getDeploymentPriority(other))
...@@ -224,6 +244,123 @@ class ServiceNode(Element): ...@@ -224,6 +244,123 @@ class ServiceNode(Element):
raise PermissionDenied raise PermissionDenied
class WordpressNode(ServiceNode):
# DB related fields
databaseListeningPort = models.PositiveIntegerField()
databaseHost = models.TextField()
databaseUser = models.TextField()
databasePass = models.TextField()
# admin user
adminUsername = models.TextField()
adminPassword = models.TextField()
adminEmail = models.TextField()
# site related fields
siteTitle = models.TextField()
siteUrl = models.TextField()
def getDataDictionary(self):
element_data = ServiceNode.getDataDictionary(self)
self_data = {'database-listening-port': self.databaseListeningPort,
'database-host': self.databaseHost,
'database-user': self.databaseUser,
'database-pass': self.databasePass,
'admin-username': self.adminUsername,
'admin-password': self.adminPassword,
'admin-email': self.adminEmail,
'site-title': self.siteTitle,
'site-url': self.siteUrl}
element_data.update(self_data)
return element_data
def fromDataDictionary(self, data):
ServiceNode.fromDataDictionary(self, data)
self.databaseListeningPort = data['database-listening-port']
self.databaseHost = data['database-host']
self.databaseUser = data['database-user']
self.databasePass = data['database-pass']
self.adminUsername = data['admin-username']
self.adminPassword = data['admin-password']
self.adminEmail = data['admin-email']
self.siteTitle = data['site-title']
self.siteUrl = data['site-url']
@staticmethod
def getInformation():
superInformation = ServiceNode.getInformation()
ownInformation = {'use-ssl': WebServerNode._meta.get_field('useSSL').get_internal_type(),
'listeningport': WebServerNode._meta.get_field('listeningport').get_internal_type()}
ownInformation = {'database-listening-port': WordpressNode._meta.get_field('databaseListeningPort').get_internal_type(),
'database-host': WordpressNode._meta.get_field('databaseHost').get_internal_type(),
'database-user': WordpressNode._meta.get_field('databaseUser').get_internal_type(),
'database-pass': WordpressNode._meta.get_field('databasePass').get_internal_type(),
'admin-username': WordpressNode._meta.get_field('adminUsername').get_internal_type(),
'admin-password': WordpressNode._meta.get_field('adminPassword').get_internal_type(),
'admin-email': WordpressNode._meta.get_field('adminEmail').get_internal_type(),
'site-title': WordpressNode._meta.get_field('siteTitle').get_internal_type(),
'site-url': WordpressNode._meta.get_field('siteUrl').get_internal_type()}
ownInformation.update(superInformation)
return ownInformation
def checkDependenciesAndAttributes(self):
errorMessages = ServiceNode.checkDependenciesAndAttributes(self)
if self.databaseListeningPort == 0:
errorMessages.append("LISTENING_PORT_NOT_SET")
if not self.databaseHost:
errorMessage.append("DATABASEHOST_NOT_SET")
if not self.databaseUser:
errorMessage.append("DATABASEUSER_NOT_SET")
if not self.databasePass:
errorMessage.append("DATABASEPASS_NOT_SET")
if not self.adminUsername:
errorMessage.append("ADMINUSERNAME_NOT_SET")
if not self.adminPassword:
errorMessage.append("ADMINPASSWORD_NOT_SET")
if not self.adminEmail:
errorMessage.append("ADMINEMAIL_NOT_SET")
if not self.siteTitle:
errorMessage.append("SITETITLE_NOT_SET")
if not self.siteUrl:
errorMessage.append("SITEURL_NOT_SET")
if not self.checkDependecy(MySQLNode):
errorMessage.append("NODE_NOT_CONNECTED")
if not self.checkDependecy(WebServerNode):
errorMessage.append("NODE_NOT_CONNECTED")
return errorMessages
@staticmethod
def getDeploymentPriority(self):
return 10
def generateConfiguration(self, config=""):
config = replaceParameter(
config, r'%%DATABASE_LISTENING_PORT%%', self.databaseListeningPort)
config = replaceParameter(
config, r'%%DATABASE_HOST%%', self.databaseHost)
config = replaceParameter(
config, r'%%DATABASE_USER%%', self.databaseUser)
config = replaceParameter(
config, r'%%DATABASE_PASS%%', self.databasePass)
config = replaceParameter(
config, r'%%ADMIN_USERNAME%%', self.adminUsername)
config = replaceParameter(
config, r'%%ADMIN_PASSWORD%%', self.adminPassword)
config = replaceParameter(config, r'%%ADMIN_EMAIL%%', self.adminEmail)
config = replaceParameter(config, r'%%SITE_TITLE%%', self.siteTitle)
config = replaceParameter(config, r'%%SITE_URL%%', self.siteUrl)
return config
class WebServerNode(ServiceNode): class WebServerNode(ServiceNode):
useSSL = models.BooleanField(default=False) useSSL = models.BooleanField(default=False)
listeningPort = models.PositiveIntegerField() listeningPort = models.PositiveIntegerField()
...@@ -242,6 +379,16 @@ class WebServerNode(ServiceNode): ...@@ -242,6 +379,16 @@ class WebServerNode(ServiceNode):
self.useSSL = data['use-ssl'] self.useSSL = data['use-ssl']
self.listeningPort = data['listeningport'] self.listeningPort = data['listeningport']
def checkDependenciesAndAttributes(self):
errorMessages = ServiceNode.checkDependenciesAndAttributes(self)
if self.listeningPort == 0:
errorMessages.append("LISTENING_PORT_NOT_SET")
if not self.checkDependecy(Machine):
errorMessages.append("NO_MACHINE_CONNECTED")
return errorMessages
@staticmethod @staticmethod
def getInformation(): def getInformation():
superInformation = ServiceNode.getInformation() superInformation = ServiceNode.getInformation()
...@@ -258,10 +405,34 @@ class WebServerNode(ServiceNode): ...@@ -258,10 +405,34 @@ class WebServerNode(ServiceNode):
def generateConfiguration(self, config=""): def generateConfiguration(self, config=""):
config = replaceParameter(config, r"%%USE_SSL%%", self.useSSL) config = replaceParameter(config, r"%%USE_SSL%%", self.useSSL)
config = replaceParameter(config, config = replaceParameter(config,
r"%%LISTENING_PORT%%", self.listeningPort) r"%%LISTENING_PORT%%", self.listeningPort)
return config return config
class ApacheNode(WebServerNode):
@staticmethod
def clone():
return ApacheNode()
def generateConfigurationRecursively(self):
config = str()
exampleFilePath = os.path.join(
SALTSTACK_STATE_FOLDER, "apache.example")
with open(exampleFilePath, 'r') as configFile:
config = configFile.read()
config = WebServerNode.generateConfiguration(self, config)
self.generatedConfig = "apache_%s.sls" % self.machine.hostname
with open(os.path.join(SALTSTACK_STATE_FOLDER, self.generatedConfig), 'w') as generatedConfigFile:
generatedConfigFile.write(config)
configuredNodes = []
configuredNodes.append(self)
return configuredNodes
class NginxNode(WebServerNode): class NginxNode(WebServerNode):
worker_connections = models.PositiveIntegerField() worker_connections = models.PositiveIntegerField()
...@@ -275,6 +446,13 @@ class NginxNode(WebServerNode): ...@@ -275,6 +446,13 @@ class NginxNode(WebServerNode):
WebServerNode.fromDataDictionary(self, data) WebServerNode.fromDataDictionary(self, data)
self.worker_connections = data['worker_connections'] self.worker_connections = data['worker_connections']
def checkDependenciesAndAttributes(self):
errorMessages = WebServerNode.checkDependenciesAndAttributes(self)
if self.worker_connections == 0:
errorMessages.append("WORKER_CONNECTIONS_NOT_SET")
return errorMessages
@staticmethod @staticmethod
def getInformation(): def getInformation():
superInformation = WebServerNode.getInformation() superInformation = WebServerNode.getInformation()
...@@ -289,12 +467,12 @@ class NginxNode(WebServerNode): ...@@ -289,12 +467,12 @@ class NginxNode(WebServerNode):
def generateConfigurationRecursively(self): def generateConfigurationRecursively(self):
config = str() config = str()
exampleFilePath = os.path.join( SALTSTACK_STATE_FOLDER, "nginx.example" ) exampleFilePath = os.path.join(SALTSTACK_STATE_FOLDER, "nginx.example")
with open(exampleFilePath, 'r') as configFile: with open(exampleFilePath, 'r') as configFile:
config = configFile.read() config = configFile.read()
config = WebServerNode.generateConfiguration(self, config) config = WebServerNode.generateConfiguration(self, config)
config = replaceParameter(config, config = replaceParameter(config,
r"%%WORKER_CONNECTIONS%%", self.worker_connections) r"%%WORKER_CONNECTIONS%%", self.worker_connections)
self.generatedConfig = "nginx_%s.sls" % self.machine.hostname self.generatedConfig = "nginx_%s.sls" % self.machine.hostname
with open(os.path.join(SALTSTACK_STATE_FOLDER, self.generatedConfig), 'w') as generatedConfigFile: with open(os.path.join(SALTSTACK_STATE_FOLDER, self.generatedConfig), 'w') as generatedConfigFile:
...@@ -314,8 +492,8 @@ class DatabaseNode(ServiceNode): ...@@ -314,8 +492,8 @@ class DatabaseNode(ServiceNode):
def getDataDictionary(self): def getDataDictionary(self):
element_data = ServiceNode.getDataDictionary(self) element_data = ServiceNode.getDataDictionary(self)
self_data = {'admin_username': self.adminUserName, self_data = {'admin_username': self.adminUserName,
'admin_password': self.adminPassword, 'admin_password': self.adminPassword,
'listeningport': self.listeningPort } 'listeningport': self.listeningPort}
element_data.update(self_data) element_data.update(self_data)
return element_data return element_data
...@@ -326,6 +504,20 @@ class DatabaseNode(ServiceNode): ...@@ -326,6 +504,20 @@ class DatabaseNode(ServiceNode):
self.adminPassword = data['admin_password'] self.adminPassword = data['admin_password']
self.listeningPort = data['listeningport'] self.listeningPort = data['listeningport']
def checkDependenciesAndAttributes(self):
errorMessages = ServiceNode.checkDependenciesAndAttributes(self)
if not self.adminUserName:
errorMessages.append("ADMIN_USER_NAME_NOT_SET")
if not self.adminPassword:
errorMessages.append("ADMIN_PASSWORD_NAME_NOT_SET")
if self.listeningPort == 0:
errorMessages.append("LISTENING_PORT_NOT_SET")
if not self.checkDependecy(Machine):
errorMessages.append("NO_MACHINE_CONNECTED")
return errorMessages
@staticmethod @staticmethod
def getInformation(): def getInformation():
superInformation = ServiceNode.getInformation() superInformation = ServiceNode.getInformation()
...@@ -341,11 +533,11 @@ class DatabaseNode(ServiceNode): ...@@ -341,11 +533,11 @@ class DatabaseNode(ServiceNode):
def generateConfiguration(self, config=""): def generateConfiguration(self, config=""):
config = replaceParameter(config, config = replaceParameter(config,
r"%%ADMIN_USERNAME%%", self.adminUserName) r"%%ADMIN_USERNAME%%", self.adminUserName)
config = replaceParameter(config, config = replaceParameter(config,
r"%%ADMIN_PASSWORD%%", self.adminUserName) r"%%ADMIN_PASSWORD%%", self.adminUserName)
config = replaceParameter(config, config = replaceParameter(config,
r'%%LISTENING_PORT%%', self.listeningPort) r'%%LISTENING_PORT%%', self.listeningPort)
return config return config
...@@ -357,8 +549,9 @@ class PostgreSQLNode(DatabaseNode): ...@@ -357,8 +549,9 @@ class PostgreSQLNode(DatabaseNode):
def generateConfigurationRecursively(self): def generateConfigurationRecursively(self):
config = str() config = str()
exampleFilePath = os.path.join( SALTSTACK_STATE_FOLDER, "postgres.example" ) exampleFilePath = os.path.join(
with open( exampleFilePath, 'r') as configFile: SALTSTACK_STATE_FOLDER, "postgres.example")
with open(exampleFilePath, 'r') as configFile:
config = configFile.read() config = configFile.read()
config = DatabaseNode.generateConfiguration(self, config) config = DatabaseNode.generateConfiguration(self, config)
...@@ -377,7 +570,7 @@ class MySQLNode(DatabaseNode): ...@@ -377,7 +570,7 @@ class MySQLNode(DatabaseNode):
def generateConfigurationRecursively(self): def generateConfigurationRecursively(self):
config = str() config = str()
exampleFilePath = os.path.join( SALTSTACK_STATE_FOLDER, "mysql.example" ) exampleFilePath = os.path.join(SALTSTACK_STATE_FOLDER, "mysql.example")
with open(exampleFilePath, 'r') as configFile: with open(exampleFilePath, 'r') as configFile:
config = configFile.read() config = configFile.read()
config = DatabaseNode.generateConfiguration(self, config) config = DatabaseNode.generateConfiguration(self, config)
......

9.07 KB | W: | H:

9.07 KB | W: | H:

circle/setty/static/setty/mysql.jpg
circle/setty/static/setty/mysql.jpg
circle/setty/static/setty/mysql.jpg
circle/setty/static/setty/mysql.jpg
  • 2-up
  • Swipe
  • Onion skin

84.4 KB | W: | H:

84.4 KB | W: | H:

circle/setty/static/setty/postgresql.png
circle/setty/static/setty/postgresql.png
circle/setty/static/setty/postgresql.png
circle/setty/static/setty/postgresql.png
  • 2-up
  • Swipe
  • Onion skin
...@@ -803,7 +803,17 @@ jsPlumb.ready(function() { ...@@ -803,7 +803,17 @@ jsPlumb.ready(function() {
/* Registering events concerning persistence. */ /* Registering events concerning persistence. */
$('body').on('click', '#saveService',function() {
$.post("", {
event: "deploy",
}, function(result) {
if ( result.status == 'error' )
alert( result.errors );
else
alert("Deploying....");
});
})
$('body').on('click', '#saveService', function() { $('body').on('click', '#saveService', function() {
serviceName = $("#serviceName").text(); serviceName = $("#serviceName").text();
connectionSet = []; connectionSet = [];
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
<button class="btn btn-success btn-xs btn-block hidden-xs hidden-sm hidden-md" id="showAddMachineDialog">{% trans 'Machines' %}</button> <button class="btn btn-success btn-xs btn-block hidden-xs hidden-sm hidden-md" id="showAddMachineDialog">{% trans 'Machines' %}</button>
<button class="btn btn-success btn-xs hidden-lg" id="showAddMachineDialog" ><i class="fa fa-plus-circle"></i></button> <button class="btn btn-success btn-xs hidden-lg" id="showAddMachineDialog" ><i class="fa fa-plus-circle"></i></button>
</div> </div>
<div class="col-xs-4 text-center"> <div class="col-xs-3 text-center">
<h3 class="no-margin" id="serviceName"></h3> <h3 class="no-margin" id="serviceName"></h3>
<input class="form-control form-control-sm initHidden" id="serviceNameEdit" type="text" style="margin-top: -4px !important; margin-bottom: -4px !important; width: 80%;" /> <input class="form-control form-control-sm initHidden" id="serviceNameEdit" type="text" style="margin-top: -4px !important; margin-bottom: -4px !important; width: 80%;" />
<button class="btn btn-success btn-xs initHidden" id="serviceNameSave">{% trans 'OK' %}</button> <button class="btn btn-success btn-xs initHidden" id="serviceNameSave">{% trans 'OK' %}</button>
...@@ -47,6 +47,10 @@ ...@@ -47,6 +47,10 @@
<button class="btn btn-success btn-xs hidden-lg" id="saveService"><i class="fa fa-floppy-o"></i></button> <button class="btn btn-success btn-xs hidden-lg" id="saveService"><i class="fa fa-floppy-o"></i></button>
</div> </div>
<div class="col-xs-1 col-xs-push-1 text-right"> <div class="col-xs-1 col-xs-push-1 text-right">
<button class="btn btn-success btn-xs btn-block hidden-xs hidden-sm hidden-md" id="saveService">{% trans 'Deploy' %}</button>
<button class="btn btn-success btn-xs hidden-lg" id="deployService"><i class="fa fa-floppy-o"></i></button>
</div>
<div class="col-xs-1 col-xs-push-1 text-right">
<button class="btn btn-danger btn-xs btn-block hidden-xs hidden-sm hidden-md" id="deleteService" data-toggle="modal" data-target="#deleteServiceDialog">{% trans 'Delete' %}</button> <button class="btn btn-danger btn-xs btn-block hidden-xs hidden-sm hidden-md" id="deleteService" data-toggle="modal" data-target="#deleteServiceDialog">{% trans 'Delete' %}</button>
<button class="btn btn-danger btn-xs hidden-lg" id="deleteService" data-toggle="modal" data-target="#deleteServiceDialog"><i class="fa fa-trash-o"></i></button> <button class="btn btn-danger btn-xs hidden-lg" id="deleteService" data-toggle="modal" data-target="#deleteServiceDialog"><i class="fa fa-trash-o"></i></button>
</div> </div>
......
...@@ -54,7 +54,7 @@ class DetailView(LoginRequiredMixin, TemplateView): ...@@ -54,7 +54,7 @@ class DetailView(LoginRequiredMixin, TemplateView):
else: else:
raise PermissionDenied raise PermissionDenied
#def get(self, request, *args, **kwargs): # def get(self, request, *args, **kwargs):
# # service = Service.objects.get(id=kwargs['pk']) # # service = Service.objects.get(id=kwargs['pk'])
# # if self.request.user != service.user or not self.request.user.is_superuser: # # if self.request.user != service.user or not self.request.user.is_superuser:
# # raise PermissionDenied # # raise PermissionDenied
...@@ -65,21 +65,20 @@ class DetailView(LoginRequiredMixin, TemplateView): ...@@ -65,21 +65,20 @@ class DetailView(LoginRequiredMixin, TemplateView):
# # result = SettyController.getPictureName( data["elementTemplateId"] ) # # result = SettyController.getPictureName( data["elementTemplateId"] )
# #
# return JsonResponse(result) # return JsonResponse(result)
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
service = Service.objects.get(id=kwargs['pk']) service = Service.objects.get(id=kwargs['pk'])
if self.request.user != service.user or not self.request.user.is_superuser: if self.request.user != service.user or not self.request.user.is_superuser:
raise PermissionDenied raise PermissionDenied
result = {} result = {}
eventName = self.request.POST.get('event') eventName = self.request.POST.get('event')
serviceId = kwargs['pk'] serviceId = kwargs['pk']
if eventName == 'loadService': if eventName == 'loadService':
result = SettyController.loadService(serviceId) result = SettyController.loadService(serviceId)
elif eventName == "deploy": elif eventName == "deploy":
result = SettyController.deploy(serviceId) result = SettyController.deploy(serviceId)
else: else:
data = json.loads(self.request.POST.get('data')) data = json.loads(self.request.POST.get('data'))
if eventName == "saveService": if eventName == "saveService":
...@@ -87,7 +86,7 @@ class DetailView(LoginRequiredMixin, TemplateView): ...@@ -87,7 +86,7 @@ class DetailView(LoginRequiredMixin, TemplateView):
'serviceNodes'], data['machines'], data['elementConnections']) 'serviceNodes'], data['machines'], data['elementConnections'])
elif eventName == "getMachineAvailableList": elif eventName == "getMachineAvailableList":
result = SettyController.getMachineAvailableList( result = SettyController.getMachineAvailableList(
serviceId, data["usedHostnames"]) serviceId, data["usedHostnames"], self.request.user )
elif eventName == "addServiceNode": elif eventName == "addServiceNode":
result = SettyController.addServiceNode( result = SettyController.addServiceNode(
data["elementTemplateId"]) data["elementTemplateId"])
...@@ -95,7 +94,7 @@ class DetailView(LoginRequiredMixin, TemplateView): ...@@ -95,7 +94,7 @@ class DetailView(LoginRequiredMixin, TemplateView):
result = SettyController.addMachine(data["hostname"]) result = SettyController.addMachine(data["hostname"])
elif eventName == "getInformation": elif eventName == "getInformation":
templateId = "" templateId = ""
hostname = "" hostname = ""
if "elementTemplateId" in data.keys(): if "elementTemplateId" in data.keys():
templateId = data['elementTemplateId'] templateId = data['elementTemplateId']
...@@ -103,8 +102,10 @@ class DetailView(LoginRequiredMixin, TemplateView): ...@@ -103,8 +102,10 @@ class DetailView(LoginRequiredMixin, TemplateView):
hostname = data['hostname'] hostname = data['hostname']
result = SettyController.getInformation( result = SettyController.getInformation(
templateId, hostname ) templateId, hostname)
print '------------'
print result
print '------------'
return JsonResponse(result) return JsonResponse(result)
...@@ -124,6 +125,7 @@ class DeleteView(LoginRequiredMixin, DeleteView): ...@@ -124,6 +125,7 @@ class DeleteView(LoginRequiredMixin, DeleteView):
class CreateView(LoginRequiredMixin, TemplateView): class CreateView(LoginRequiredMixin, TemplateView):
def get_template_names(self): def get_template_names(self):
if self.request.is_ajax(): if self.request.is_ajax():
return ['dashboard/_modal.html'] return ['dashboard/_modal.html']
......
./vm/migrations/0001_initial.py:29:80: E501 line too long (114 > 79 characters)
./vm/migrations/0001_initial.py:30:80: E501 line too long (140 > 79 characters)
./vm/migrations/0001_initial.py:31:80: E501 line too long (147 > 79 characters)
./vm/migrations/0001_initial.py:32:80: E501 line too long (326 > 79 characters)
./vm/migrations/0001_initial.py:33:80: E501 line too long (152 > 79 characters)
./vm/migrations/0001_initial.py:34:80: E501 line too long (216 > 79 characters)
./vm/migrations/0001_initial.py:35:80: E501 line too long (167 > 79 characters)
./vm/migrations/0001_initial.py:36:80: E501 line too long (197 > 79 characters)
./vm/migrations/0001_initial.py:37:80: E501 line too long (154 > 79 characters)
./vm/migrations/0001_initial.py:38:80: E501 line too long (160 > 79 characters)
./vm/migrations/0001_initial.py:39:80: E501 line too long (196 > 79 characters)
./vm/migrations/0001_initial.py:40:80: E501 line too long (146 > 79 characters)
./vm/migrations/0001_initial.py:41:80: E501 line too long (149 > 79 characters)
./vm/migrations/0001_initial.py:42:80: E501 line too long (165 > 79 characters)
./vm/migrations/0001_initial.py:43:80: E501 line too long (183 > 79 characters)
./vm/migrations/0001_initial.py:44:80: E501 line too long (138 > 79 characters)
./vm/migrations/0001_initial.py:45:80: E501 line too long (90 > 79 characters)
./vm/migrations/0001_initial.py:46:80: E501 line too long (129 > 79 characters)
./vm/migrations/0001_initial.py:47:80: E501 line too long (179 > 79 characters)
./vm/migrations/0001_initial.py:48:80: E501 line too long (175 > 79 characters)
./vm/migrations/0001_initial.py:49:80: E501 line too long (174 > 79 characters)
./vm/migrations/0001_initial.py:51:80: E501 line too long (134 > 79 characters)
./vm/migrations/0001_initial.py:52:80: E501 line too long (155 > 79 characters)
./vm/migrations/0001_initial.py:59:80: E501 line too long (448 > 79 characters)
./vm/migrations/0001_initial.py:66:80: E501 line too long (114 > 79 characters)
./vm/migrations/0001_initial.py:67:80: E501 line too long (140 > 79 characters)
./vm/migrations/0001_initial.py:68:80: E501 line too long (147 > 79 characters)
./vm/migrations/0001_initial.py:69:80: E501 line too long (98 > 79 characters)
./vm/migrations/0001_initial.py:70:80: E501 line too long (172 > 79 characters)
./vm/migrations/0001_initial.py:71:80: E501 line too long (169 > 79 characters)
./vm/migrations/0001_initial.py:72:80: E501 line too long (142 > 79 characters)
./vm/migrations/0001_initial.py:73:80: E501 line too long (146 > 79 characters)
./vm/migrations/0001_initial.py:74:80: E501 line too long (117 > 79 characters)
./vm/migrations/0001_initial.py:75:80: E501 line too long (154 > 79 characters)
./vm/migrations/0001_initial.py:76:80: E501 line too long (92 > 79 characters)
./vm/migrations/0001_initial.py:77:80: E501 line too long (124 > 79 characters)
./vm/migrations/0001_initial.py:78:80: E501 line too long (166 > 79 characters)
./vm/migrations/0001_initial.py:79:80: E501 line too long (120 > 79 characters)
./vm/migrations/0001_initial.py:80:80: E501 line too long (168 > 79 characters)
./vm/migrations/0001_initial.py:91:80: E501 line too long (114 > 79 characters)
./vm/migrations/0001_initial.py:92:80: E501 line too long (140 > 79 characters)
./vm/migrations/0001_initial.py:93:80: E501 line too long (147 > 79 characters)
./vm/migrations/0001_initial.py:94:80: E501 line too long (216 > 79 characters)
./vm/migrations/0001_initial.py:95:80: E501 line too long (167 > 79 characters)
./vm/migrations/0001_initial.py:96:80: E501 line too long (197 > 79 characters)
./vm/migrations/0001_initial.py:97:80: E501 line too long (154 > 79 characters)
./vm/migrations/0001_initial.py:98:80: E501 line too long (160 > 79 characters)
./vm/migrations/0001_initial.py:99:80: E501 line too long (196 > 79 characters)
./vm/migrations/0001_initial.py:100:80: E501 line too long (146 > 79 characters)
./vm/migrations/0001_initial.py:101:80: E501 line too long (149 > 79 characters)
./vm/migrations/0001_initial.py:102:80: E501 line too long (165 > 79 characters)
./vm/migrations/0001_initial.py:103:80: E501 line too long (183 > 79 characters)
./vm/migrations/0001_initial.py:104:80: E501 line too long (126 > 79 characters)
./vm/migrations/0001_initial.py:105:80: E501 line too long (90 > 79 characters)
./vm/migrations/0001_initial.py:106:80: E501 line too long (164 > 79 characters)
./vm/migrations/0001_initial.py:113:80: E501 line too long (228 > 79 characters)
./vm/migrations/0001_initial.py:120:80: E501 line too long (114 > 79 characters)
./vm/migrations/0001_initial.py:121:80: E501 line too long (108 > 79 characters)
./vm/migrations/0001_initial.py:122:80: E501 line too long (121 > 79 characters)
./vm/migrations/0001_initial.py:123:80: E501 line too long (114 > 79 characters)
./vm/migrations/0001_initial.py:134:80: E501 line too long (114 > 79 characters)
./vm/migrations/0001_initial.py:135:80: E501 line too long (170 > 79 characters)
./vm/migrations/0001_initial.py:136:80: E501 line too long (186 > 79 characters)
./vm/migrations/0001_initial.py:137:80: E501 line too long (132 > 79 characters)
./vm/migrations/0001_initial.py:150:80: E501 line too long (114 > 79 characters)
./vm/migrations/0001_initial.py:151:80: E501 line too long (93 > 79 characters)
./vm/migrations/0001_initial.py:152:80: E501 line too long (189 > 79 characters)
./vm/migrations/0001_initial.py:153:80: E501 line too long (185 > 79 characters)
./vm/migrations/0001_initial.py:165:80: E501 line too long (114 > 79 characters)
./vm/migrations/0001_initial.py:166:80: E501 line too long (140 > 79 characters)
./vm/migrations/0001_initial.py:167:80: E501 line too long (147 > 79 characters)
./vm/migrations/0001_initial.py:168:80: E501 line too long (216 > 79 characters)
./vm/migrations/0001_initial.py:169:80: E501 line too long (167 > 79 characters)
./vm/migrations/0001_initial.py:170:80: E501 line too long (197 > 79 characters)
./vm/migrations/0001_initial.py:171:80: E501 line too long (154 > 79 characters)
./vm/migrations/0001_initial.py:172:80: E501 line too long (160 > 79 characters)
./vm/migrations/0001_initial.py:173:80: E501 line too long (142 > 79 characters)
./vm/migrations/0001_initial.py:183:80: E501 line too long (114 > 79 characters)
./vm/migrations/0001_initial.py:184:80: E501 line too long (140 > 79 characters)
./vm/migrations/0001_initial.py:185:80: E501 line too long (147 > 79 characters)
./vm/migrations/0001_initial.py:186:80: E501 line too long (134 > 79 characters)
./vm/migrations/0001_initial.py:187:80: E501 line too long (123 > 79 characters)
./vm/migrations/0001_initial.py:188:80: E501 line too long (109 > 79 characters)
./vm/migrations/0001_initial.py:189:80: E501 line too long (153 > 79 characters)
./vm/migrations/0001_initial.py:190:80: E501 line too long (187 > 79 characters)
./vm/migrations/0001_initial.py:191:80: E501 line too long (163 > 79 characters)
./vm/migrations/0001_initial.py:192:80: E501 line too long (116 > 79 characters)
./vm/migrations/0001_initial.py:193:80: E501 line too long (182 > 79 characters)
./vm/migrations/0001_initial.py:198:80: E501 line too long (91 > 79 characters)
./vm/migrations/0001_initial.py:205:80: E501 line too long (114 > 79 characters)
./vm/migrations/0001_initial.py:206:80: E501 line too long (140 > 79 characters)
./vm/migrations/0001_initial.py:207:80: E501 line too long (147 > 79 characters)
./vm/migrations/0001_initial.py:208:80: E501 line too long (98 > 79 characters)
./vm/migrations/0001_initial.py:209:80: E501 line too long (172 > 79 characters)
./vm/migrations/0001_initial.py:210:80: E501 line too long (169 > 79 characters)
./vm/migrations/0001_initial.py:211:80: E501 line too long (142 > 79 characters)
./vm/migrations/0001_initial.py:212:80: E501 line too long (146 > 79 characters)
./vm/migrations/0001_initial.py:213:80: E501 line too long (117 > 79 characters)
./vm/migrations/0001_initial.py:214:80: E501 line too long (154 > 79 characters)
./vm/migrations/0001_initial.py:215:80: E501 line too long (150 > 79 characters)
./vm/migrations/0001_initial.py:216:80: E501 line too long (116 > 79 characters)
./vm/migrations/0001_initial.py:217:80: E501 line too long (168 > 79 characters)
./vm/migrations/0001_initial.py:227:80: E501 line too long (114 > 79 characters)
./vm/migrations/0001_initial.py:238:80: E501 line too long (121 > 79 characters)
./vm/migrations/0001_initial.py:244:80: E501 line too long (116 > 79 characters)
./vm/migrations/0001_initial.py:256:80: E501 line too long (215 > 79 characters)
./vm/migrations/0001_initial.py:262:80: E501 line too long (195 > 79 characters)
./vm/migrations/0001_initial.py:268:80: E501 line too long (174 > 79 characters)
./vm/migrations/0001_initial.py:274:80: E501 line too long (116 > 79 characters)
./vm/migrations/0001_initial.py:280:80: E501 line too long (178 > 79 characters)
./vm/migrations/0001_initial.py:292:80: E501 line too long (195 > 79 characters)
./vm/migrations/0001_initial.py:298:80: E501 line too long (174 > 79 characters)
./vm/migrations/0001_initial.py:304:80: E501 line too long (234 > 79 characters)
./vm/migrations/0002_interface_model.py:17:80: E501 line too long (190 > 79 characters)
./storage/migrations/0001_initial.py:19:80: E501 line too long (114 > 79 characters)
./storage/migrations/0001_initial.py:20:80: E501 line too long (93 > 79 characters)
./storage/migrations/0001_initial.py:21:80: E501 line too long (93 > 79 characters)
./storage/migrations/0001_initial.py:22:80: E501 line too long (100 > 79 characters)
./storage/migrations/0001_initial.py:34:80: E501 line too long (114 > 79 characters)
./storage/migrations/0001_initial.py:35:80: E501 line too long (140 > 79 characters)
./storage/migrations/0001_initial.py:36:80: E501 line too long (147 > 79 characters)
./storage/migrations/0001_initial.py:37:80: E501 line too long (92 > 79 characters)
./storage/migrations/0001_initial.py:38:80: E501 line too long (101 > 79 characters)
./storage/migrations/0001_initial.py:39:80: E501 line too long (198 > 79 characters)
./storage/migrations/0001_initial.py:40:80: E501 line too long (82 > 79 characters)
./storage/migrations/0001_initial.py:41:80: E501 line too long (103 > 79 characters)
./storage/migrations/0001_initial.py:42:80: E501 line too long (89 > 79 characters)
./storage/migrations/0001_initial.py:44:80: E501 line too long (114 > 79 characters)
./storage/migrations/0001_initial.py:45:80: E501 line too long (147 > 79 characters)
./storage/migrations/0001_initial.py:51:80: E501 line too long (166 > 79 characters)
./storage/migrations/0002_disk_bus.py:17:80: E501 line too long (153 > 79 characters)
./request/migrations/0001_initial.py:23:80: E501 line too long (114 > 79 characters)
./request/migrations/0001_initial.py:34:80: E501 line too long (114 > 79 characters)
./request/migrations/0001_initial.py:46:80: E501 line too long (114 > 79 characters)
./request/migrations/0001_initial.py:47:80: E501 line too long (140 > 79 characters)
./request/migrations/0001_initial.py:48:80: E501 line too long (147 > 79 characters)
./request/migrations/0001_initial.py:49:80: E501 line too long (169 > 79 characters)
./request/migrations/0001_initial.py:50:80: E501 line too long (166 > 79 characters)
./request/migrations/0001_initial.py:54:80: E501 line too long (115 > 79 characters)
./request/migrations/0001_initial.py:55:80: E501 line too long (83 > 79 characters)
./request/migrations/0001_initial.py:56:80: E501 line too long (94 > 79 characters)
./request/migrations/0001_initial.py:66:80: E501 line too long (114 > 79 characters)
./request/migrations/0001_initial.py:67:80: E501 line too long (216 > 79 characters)
./request/migrations/0001_initial.py:68:80: E501 line too long (167 > 79 characters)
./request/migrations/0001_initial.py:69:80: E501 line too long (160 > 79 characters)
./request/migrations/0001_initial.py:80:80: E501 line too long (114 > 79 characters)
./request/migrations/0001_initial.py:81:80: E501 line too long (132 > 79 characters)
./request/migrations/0001_initial.py:91:80: E501 line too long (114 > 79 characters)
./request/migrations/0001_initial.py:93:80: E501 line too long (80 > 79 characters)
./request/migrations/0002_auto_20150407_1117.py:35:80: E501 line too long (93 > 79 characters)
./request/migrations/0003_auto_20150410_1917.py:23:80: E501 line too long (166 > 79 characters)
./.ropeproject/config.py:23:5: E265 block comment should start with '# '
./.ropeproject/config.py:33:5: E265 block comment should start with '# '
./.ropeproject/config.py:36:5: E265 block comment should start with '# '
./acl/migrations/0001_initial.py:20:80: E501 line too long (114 > 79 characters)
./acl/migrations/0001_initial.py:21:80: E501 line too long (80 > 79 characters)
./acl/migrations/0001_initial.py:22:80: E501 line too long (89 > 79 characters)
./acl/migrations/0001_initial.py:23:80: E501 line too long (83 > 79 characters)
./acl/migrations/0001_initial.py:24:80: E501 line too long (83 > 79 characters)
./acl/migrations/0001_initial.py:33:80: E501 line too long (114 > 79 characters)
./acl/migrations/0001_initial.py:35:80: E501 line too long (83 > 79 characters)
./firewall/migrations/0001_initial.py:21:80: E501 line too long (114 > 79 characters)
./firewall/migrations/0001_initial.py:22:80: E501 line too long (86 > 79 characters)
./firewall/migrations/0001_initial.py:23:80: E501 line too long (80 > 79 characters)
./firewall/migrations/0001_initial.py:24:80: E501 line too long (94 > 79 characters)
./firewall/migrations/0001_initial.py:25:80: E501 line too long (233 > 79 characters)
./firewall/migrations/0001_initial.py:26:80: E501 line too long (99 > 79 characters)
./firewall/migrations/0001_initial.py:27:80: E501 line too long (97 > 79 characters)
./firewall/migrations/0001_initial.py:38:80: E501 line too long (114 > 79 characters)
./firewall/migrations/0001_initial.py:39:80: E501 line too long (120 > 79 characters)
./firewall/migrations/0001_initial.py:40:80: E501 line too long (99 > 79 characters)
./firewall/migrations/0001_initial.py:41:80: E501 line too long (97 > 79 characters)
./firewall/migrations/0001_initial.py:43:80: E501 line too long (90 > 79 characters)
./firewall/migrations/0001_initial.py:44:80: E501 line too long (96 > 79 characters)
./firewall/migrations/0001_initial.py:53:80: E501 line too long (114 > 79 characters)
./firewall/migrations/0001_initial.py:54:80: E501 line too long (200 > 79 characters)
./firewall/migrations/0001_initial.py:55:80: E501 line too long (99 > 79 characters)
./firewall/migrations/0001_initial.py:56:80: E501 line too long (97 > 79 characters)
./firewall/migrations/0001_initial.py:65:80: E501 line too long (114 > 79 characters)
./firewall/migrations/0001_initial.py:66:80: E501 line too long (92 > 79 characters)
./firewall/migrations/0001_initial.py:75:80: E501 line too long (114 > 79 characters)
./firewall/migrations/0001_initial.py:76:80: E501 line too long (128 > 79 characters)
./firewall/migrations/0001_initial.py:77:80: E501 line too long (129 > 79 characters)
./firewall/migrations/0001_initial.py:78:80: E501 line too long (99 > 79 characters)
./firewall/migrations/0001_initial.py:79:80: E501 line too long (97 > 79 characters)
./firewall/migrations/0001_initial.py:80:80: E501 line too long (119 > 79 characters)
./firewall/migrations/0001_initial.py:89:80: E501 line too long (114 > 79 characters)
./firewall/migrations/0001_initial.py:90:80: E501 line too long (209 > 79 characters)
./firewall/migrations/0001_initial.py:91:80: E501 line too long (131 > 79 characters)
./firewall/migrations/0001_initial.py:92:80: E501 line too long (247 > 79 characters)
./firewall/migrations/0001_initial.py:93:80: E501 line too long (211 > 79 characters)
./firewall/migrations/0001_initial.py:94:80: E501 line too long (186 > 79 characters)
./firewall/migrations/0001_initial.py:95:80: E501 line too long (227 > 79 characters)
./firewall/migrations/0001_initial.py:96:80: E501 line too long (220 > 79 characters)
./firewall/migrations/0001_initial.py:97:80: E501 line too long (162 > 79 characters)
./firewall/migrations/0001_initial.py:98:80: E501 line too long (154 > 79 characters)
./firewall/migrations/0001_initial.py:99:80: E501 line too long (80 > 79 characters)
./firewall/migrations/0001_initial.py:100:80: E501 line too long (135 > 79 characters)
./firewall/migrations/0001_initial.py:101:80: E501 line too long (99 > 79 characters)
./firewall/migrations/0001_initial.py:102:80: E501 line too long (97 > 79 characters)
./firewall/migrations/0001_initial.py:103:80: E501 line too long (167 > 79 characters)
./firewall/migrations/0001_initial.py:104:80: E501 line too long (147 > 79 characters)
./firewall/migrations/0001_initial.py:114:80: E501 line too long (114 > 79 characters)
./firewall/migrations/0001_initial.py:115:80: E501 line too long (152 > 79 characters)
./firewall/migrations/0001_initial.py:116:80: E501 line too long (212 > 79 characters)
./firewall/migrations/0001_initial.py:117:80: E501 line too long (86 > 79 characters)
./firewall/migrations/0001_initial.py:119:80: E501 line too long (90 > 79 characters)
./firewall/migrations/0001_initial.py:120:80: E501 line too long (99 > 79 characters)
./firewall/migrations/0001_initial.py:121:80: E501 line too long (97 > 79 characters)
./firewall/migrations/0001_initial.py:122:80: E501 line too long (91 > 79 characters)
./firewall/migrations/0001_initial.py:123:80: E501 line too long (108 > 79 characters)
./firewall/migrations/0001_initial.py:124:80: E501 line too long (96 > 79 characters)
./firewall/migrations/0001_initial.py:134:80: E501 line too long (114 > 79 characters)
./firewall/migrations/0001_initial.py:135:80: E501 line too long (190 > 79 characters)
./firewall/migrations/0001_initial.py:136:80: E501 line too long (148 > 79 characters)
./firewall/migrations/0001_initial.py:137:80: E501 line too long (264 > 79 characters)
./firewall/migrations/0001_initial.py:138:80: E501 line too long (260 > 79 characters)
./firewall/migrations/0001_initial.py:139:80: E501 line too long (218 > 79 characters)
./firewall/migrations/0001_initial.py:140:80: E501 line too long (218 > 79 characters)
./firewall/migrations/0001_initial.py:141:80: E501 line too long (161 > 79 characters)
./firewall/migrations/0001_initial.py:142:80: E501 line too long (233 > 79 characters)
./firewall/migrations/0001_initial.py:143:80: E501 line too long (140 > 79 characters)
./firewall/migrations/0001_initial.py:144:80: E501 line too long (260 > 79 characters)
./firewall/migrations/0001_initial.py:145:80: E501 line too long (147 > 79 characters)
./firewall/migrations/0001_initial.py:146:80: E501 line too long (99 > 79 characters)
./firewall/migrations/0001_initial.py:147:80: E501 line too long (97 > 79 characters)
./firewall/migrations/0001_initial.py:148:80: E501 line too long (207 > 79 characters)
./firewall/migrations/0001_initial.py:151:80: E501 line too long (98 > 79 characters)
./firewall/migrations/0001_initial.py:160:80: E501 line too long (114 > 79 characters)
./firewall/migrations/0001_initial.py:161:80: E501 line too long (90 > 79 characters)
./firewall/migrations/0001_initial.py:162:80: E501 line too long (99 > 79 characters)
./firewall/migrations/0001_initial.py:163:80: E501 line too long (97 > 79 characters)
./firewall/migrations/0001_initial.py:172:80: E501 line too long (114 > 79 characters)
./firewall/migrations/0001_initial.py:173:80: E501 line too long (224 > 79 characters)
./firewall/migrations/0001_initial.py:174:80: E501 line too long (177 > 79 characters)
./firewall/migrations/0001_initial.py:175:80: E501 line too long (285 > 79 characters)
./firewall/migrations/0001_initial.py:176:80: E501 line too long (321 > 79 characters)
./firewall/migrations/0001_initial.py:177:80: E501 line too long (204 > 79 characters)
./firewall/migrations/0001_initial.py:178:80: E501 line too long (267 > 79 characters)
./firewall/migrations/0001_initial.py:179:80: E501 line too long (185 > 79 characters)
./firewall/migrations/0001_initial.py:180:80: E501 line too long (87 > 79 characters)
./firewall/migrations/0001_initial.py:181:80: E501 line too long (162 > 79 characters)
./firewall/migrations/0001_initial.py:182:80: E501 line too long (129 > 79 characters)
./firewall/migrations/0001_initial.py:183:80: E501 line too long (539 > 79 characters)
./firewall/migrations/0001_initial.py:184:80: E501 line too long (181 > 79 characters)
./firewall/migrations/0001_initial.py:185:80: E501 line too long (254 > 79 characters)
./firewall/migrations/0001_initial.py:186:80: E501 line too long (99 > 79 characters)
./firewall/migrations/0001_initial.py:187:80: E501 line too long (97 > 79 characters)
./firewall/migrations/0001_initial.py:188:80: E501 line too long (153 > 79 characters)
./firewall/migrations/0001_initial.py:189:80: E501 line too long (119 > 79 characters)
./firewall/migrations/0001_initial.py:190:80: E501 line too long (270 > 79 characters)
./firewall/migrations/0001_initial.py:200:80: E501 line too long (114 > 79 characters)
./firewall/migrations/0001_initial.py:201:80: E501 line too long (128 > 79 characters)
./firewall/migrations/0001_initial.py:202:80: E501 line too long (129 > 79 characters)
./firewall/migrations/0001_initial.py:203:80: E501 line too long (99 > 79 characters)
./firewall/migrations/0001_initial.py:204:80: E501 line too long (97 > 79 characters)
./firewall/migrations/0001_initial.py:205:80: E501 line too long (119 > 79 characters)
./firewall/migrations/0001_initial.py:206:80: E501 line too long (170 > 79 characters)
./firewall/migrations/0001_initial.py:215:80: E501 line too long (142 > 79 characters)
./firewall/migrations/0001_initial.py:221:80: E501 line too long (117 > 79 characters)
./firewall/migrations/0001_initial.py:227:80: E501 line too long (212 > 79 characters)
./firewall/migrations/0001_initial.py:233:80: E501 line too long (179 > 79 characters)
./firewall/migrations/0001_initial.py:239:80: E501 line too long (196 > 79 characters)
./firewall/migrations/0001_initial.py:245:80: E501 line too long (159 > 79 characters)
./firewall/migrations/0001_initial.py:251:80: E501 line too long (179 > 79 characters)
./firewall/migrations/0001_initial.py:257:80: E501 line too long (200 > 79 characters)
./firewall/migrations/0001_initial.py:263:80: E501 line too long (129 > 79 characters)
./firewall/migrations/0001_initial.py:273:80: E501 line too long (123 > 79 characters)
./firewall/migrations/0001_initial.py:279:80: E501 line too long (100 > 79 characters)
./firewall/migrations/0002_auto_20150115_0021.py:18:80: E501 line too long (677 > 79 characters)
./firewall/migrations/0003_auto_20150226_1927.py:21:80: E501 line too long (103 > 79 characters)
./firewall/migrations/0003_auto_20150226_1927.py:27:80: E501 line too long (81 > 79 characters)
./firewall/migrations/0003_auto_20150226_1927.py:33:80: E501 line too long (108 > 79 characters)
./firewall/migrations/0003_auto_20150226_1927.py:39:80: E501 line too long (81 > 79 characters)
./firewall/migrations/0003_auto_20150226_1927.py:45:80: E501 line too long (88 > 79 characters)
./firewall/migrations/0004_auto_20150318_1317.py:4:1: F401 'models' imported but unused
./firewall/migrations/0004_auto_20150318_1317.py:16:80: E501 line too long (118 > 79 characters)
./firewall/migrations/0004_auto_20150318_1317.py:20:80: E501 line too long (102 > 79 characters)
./firewall/migrations/0004_auto_20150318_1317.py:24:80: E501 line too long (120 > 79 characters)
./firewall/migrations/0004_auto_20150318_1317.py:28:80: E501 line too long (106 > 79 characters)
./firewall/migrations/0004_auto_20150318_1317.py:32:80: E501 line too long (110 > 79 characters)
./firewall/migrations/0004_auto_20150318_1317.py:36:80: E501 line too long (113 > 79 characters)
./firewall/migrations/0004_auto_20150318_1317.py:40:80: E501 line too long (112 > 79 characters)
./firewall/migrations/0004_auto_20150318_1317.py:44:80: E501 line too long (99 > 79 characters)
./firewall/migrations/0004_auto_20150318_1317.py:48:80: E501 line too long (110 > 79 characters)
./firewall/migrations/0005_auto_20150520_2250.py:17:80: E501 line too long (146 > 79 characters)
./firewall/migrations/0005_auto_20150520_2250.py:22:80: E501 line too long (248 > 79 characters)
./firewall/migrations/0005_auto_20150520_2250.py:27:80: E501 line too long (150 > 79 characters)
./bower_components/no-vnc/utils/img2js.py:9:11: E401 multiple imports on one line
./bower_components/no-vnc/utils/img2js.py:23:4: E221 multiple spaces before operator
./bower_components/no-vnc/utils/img2js.py:26:3: E271 multiple spaces after keyword
./bower_components/no-vnc/utils/img2js.py:26:18: E701 multiple statements on one line (colon)
./bower_components/no-vnc/utils/img2js.py:27:28: E701 multiple statements on one line (colon)
./bower_components/no-vnc/utils/img2js.py:28:18: E701 multiple statements on one line (colon)
./bower_components/no-vnc/utils/img2js.py:40:9: E126 continuation line over-indented for hanging indent
./bower_components/no-vnc/utils/json2graph.py:10:1: F401 'pprint' imported but unused
./bower_components/no-vnc/utils/json2graph.py:10:11: E401 multiple imports on one line
./bower_components/no-vnc/utils/json2graph.py:15:1: E302 expected 2 blank lines, found 1
./bower_components/no-vnc/utils/json2graph.py:18:72: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:19:59: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:20:72: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:21:70: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:22:15: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:24:16: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:25:26: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:26:32: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:27:37: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:28:37: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:29:24: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:30:21: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:31:32: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:32:37: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:33:37: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:34:24: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:35:21: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:36:32: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:37:37: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:38:37: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:39:24: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:40:20: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:41:19: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:42:27: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:43:37: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:44:39: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:45:59: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:46:59: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:47:26: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:48:23: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:49:39: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:50:24: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:51:23: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:52:21: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:53:37: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:54:24: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:55:21: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:56:22: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:57:19: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:58:16: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/json2graph.py:61:1: E302 expected 2 blank lines, found 1
./bower_components/no-vnc/utils/json2graph.py:66:1: E265 block comment should start with '# '
./bower_components/no-vnc/utils/json2graph.py:165:36: E261 at least two spaces before inline comment
./bower_components/no-vnc/utils/json2graph.py:167:29: E231 missing whitespace after ','
./bower_components/no-vnc/utils/json2graph.py:179:22: E201 whitespace after '('
./bower_components/no-vnc/utils/json2graph.py:179:35: E202 whitespace before ')'
./bower_components/no-vnc/utils/json2graph.py:183:13: E201 whitespace after '('
./bower_components/no-vnc/utils/json2graph.py:184:13: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/json2graph.py:184:16: E251 unexpected spaces around keyword / parameter equals
./bower_components/no-vnc/utils/json2graph.py:184:18: E251 unexpected spaces around keyword / parameter equals
./bower_components/no-vnc/utils/json2graph.py:184:49: E251 unexpected spaces around keyword / parameter equals
./bower_components/no-vnc/utils/json2graph.py:184:51: E251 unexpected spaces around keyword / parameter equals
./bower_components/no-vnc/utils/json2graph.py:186:1: E302 expected 2 blank lines, found 1
./bower_components/no-vnc/utils/json2graph.py:192:68: E228 missing whitespace around modulo operator
./bower_components/no-vnc/utils/json2graph.py:192:80: E501 line too long (80 > 79 characters)
./bower_components/no-vnc/utils/json2graph.py:193:17: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/json2graph.py:201:1: E265 block comment should start with '# '
./bower_components/no-vnc/utils/web.py:11:17: E401 multiple imports on one line
./bower_components/no-vnc/utils/web.py:14:1: E265 block comment should start with '# '
./bower_components/no-vnc/utils/web.py:17:1: E302 expected 2 blank lines, found 1
./bower_components/no-vnc/utils/web.py:22:1: E302 expected 2 blank lines, found 1
./bower_components/no-vnc/utils/web.py:25:5: E265 block comment should start with '# '
./bower_components/no-vnc/utils/web.py:37:25: E126 continuation line over-indented for hanging indent
./bower_components/no-vnc/utils/websocket.py:19:10: E401 multiple imports on one line
./bower_components/no-vnc/utils/websocket.py:20:13: E401 multiple imports on one line
./bower_components/no-vnc/utils/websocket.py:34:4: E701 multiple statements on one line (colon)
./bower_components/no-vnc/utils/websocket.py:34:5: E272 multiple spaces before keyword
./bower_components/no-vnc/utils/websocket.py:35:7: E701 multiple statements on one line (colon)
./bower_components/no-vnc/utils/websocket.py:35:9: F401 'StringIO' imported but unused
./bower_components/no-vnc/utils/websocket.py:36:4: E701 multiple statements on one line (colon)
./bower_components/no-vnc/utils/websocket.py:36:5: E272 multiple spaces before keyword
./bower_components/no-vnc/utils/websocket.py:37:7: E701 multiple statements on one line (colon)
./bower_components/no-vnc/utils/websocket.py:40:4: E701 multiple statements on one line (colon)
./bower_components/no-vnc/utils/websocket.py:40:5: E272 multiple spaces before keyword
./bower_components/no-vnc/utils/websocket.py:41:7: E701 multiple statements on one line (colon)
./bower_components/no-vnc/utils/websocket.py:48:5: E301 expected 1 blank line, found 0
./bower_components/no-vnc/utils/websocket.py:63:4: F821 undefined name 'multiprocessing'
./bower_components/no-vnc/utils/websocket.py:82:80: E501 line too long (84 > 79 characters)
./bower_components/no-vnc/utils/websocket.py:103:17: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:118:12: F821 undefined name 'numpy'
./bower_components/no-vnc/utils/websocket.py:121:24: F821 undefined name 'numpy'
./bower_components/no-vnc/utils/websocket.py:121:52: F821 undefined name 'numpy'
./bower_components/no-vnc/utils/websocket.py:122:25: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:123:24: F821 undefined name 'numpy'
./bower_components/no-vnc/utils/websocket.py:123:52: F821 undefined name 'numpy'
./bower_components/no-vnc/utils/websocket.py:124:25: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:125:17: E265 block comment should start with '# '
./bower_components/no-vnc/utils/websocket.py:126:21: F821 undefined name 'numpy'
./bower_components/no-vnc/utils/websocket.py:129:17: E265 block comment should start with '# '
./bower_components/no-vnc/utils/websocket.py:130:24: F821 undefined name 'numpy'
./bower_components/no-vnc/utils/websocket.py:130:52: F821 undefined name 'numpy'
./bower_components/no-vnc/utils/websocket.py:131:25: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:132:24: F821 undefined name 'numpy'
./bower_components/no-vnc/utils/websocket.py:132:52: F821 undefined name 'numpy'
./bower_components/no-vnc/utils/websocket.py:133:25: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:134:25: E126 continuation line over-indented for hanging indent
./bower_components/no-vnc/utils/websocket.py:135:21: F821 undefined name 'numpy'
./bower_components/no-vnc/utils/websocket.py:161:36: E261 at least two spaces before inline comment
./bower_components/no-vnc/utils/websocket.py:170:9: E265 block comment should start with '# '
./bower_components/no-vnc/utils/websocket.py:189:28: E203 whitespace before ':'
./bower_components/no-vnc/utils/websocket.py:190:28: E203 whitespace before ':'
./bower_components/no-vnc/utils/websocket.py:191:28: E203 whitespace before ':'
./bower_components/no-vnc/utils/websocket.py:192:28: E203 whitespace before ':'
./bower_components/no-vnc/utils/websocket.py:193:28: E203 whitespace before ':'
./bower_components/no-vnc/utils/websocket.py:194:28: E203 whitespace before ':'
./bower_components/no-vnc/utils/websocket.py:195:28: E203 whitespace before ':'
./bower_components/no-vnc/utils/websocket.py:196:28: E203 whitespace before ':'
./bower_components/no-vnc/utils/websocket.py:197:28: E203 whitespace before ':'
./bower_components/no-vnc/utils/websocket.py:206:21: E261 at least two spaces before inline comment
./bower_components/no-vnc/utils/websocket.py:218:25: E261 at least two spaces before inline comment
./bower_components/no-vnc/utils/websocket.py:223:25: E261 at least two spaces before inline comment
./bower_components/no-vnc/utils/websocket.py:228:28: E261 at least two spaces before inline comment
./bower_components/no-vnc/utils/websocket.py:229:21: E261 at least two spaces before inline comment
./bower_components/no-vnc/utils/websocket.py:238:51: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:260:5: E303 too many blank lines (2)
./bower_components/no-vnc/utils/websocket.py:301:80: E501 line too long (91 > 79 characters)
./bower_components/no-vnc/utils/websocket.py:303:80: E501 line too long (92 > 79 characters)
./bower_components/no-vnc/utils/websocket.py:307:29: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:308:33: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:350:13: E265 block comment should start with '# '
./bower_components/no-vnc/utils/websocket.py:352:33: E711 comparison to None should be 'if cond is None:'
./bower_components/no-vnc/utils/websocket.py:359:43: E261 at least two spaces before inline comment
./bower_components/no-vnc/utils/websocket.py:367:17: F841 local variable 'start' is assigned to but never used
./bower_components/no-vnc/utils/websocket.py:368:17: F841 local variable 'end' is assigned to but never used
./bower_components/no-vnc/utils/websocket.py:371:52: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:374:48: E127 continuation line over-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:376:25: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:379:13: E303 too many blank lines (2)
./bower_components/no-vnc/utils/websocket.py:422:80: E501 line too long (89 > 79 characters)
./bower_components/no-vnc/utils/websocket.py:439:80: E501 line too long (104 > 79 characters)
./bower_components/no-vnc/utils/websocket.py:448:13: E129 visually indented line with same indent as next logical line
./bower_components/no-vnc/utils/websocket.py:457:27: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:488:31: E701 multiple statements on one line (colon)
./bower_components/no-vnc/utils/websocket.py:505:80: E501 line too long (85 > 79 characters)
./bower_components/no-vnc/utils/websocket.py:520:80: E501 line too long (92 > 79 characters)
./bower_components/no-vnc/utils/websocket.py:553:80: E501 line too long (118 > 79 characters)
./bower_components/no-vnc/utils/websocket.py:565:13: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:566:13: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:567:13: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:568:13: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:569:13: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:570:13: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:574:21: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:575:25: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:576:25: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:577:25: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:578:22: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:579:20: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:580:22: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:581:21: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:582:26: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:583:21: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:585:25: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:586:27: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:587:24: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:589:20: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:590:27: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:591:25: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:592:26: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:593:27: E221 multiple spaces before operator
./bower_components/no-vnc/utils/websocket.py:610:16: F821 undefined name 'ssl'
./bower_components/no-vnc/utils/websocket.py:612:32: F821 undefined name 'resource'
./bower_components/no-vnc/utils/websocket.py:618:17: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:622:12: F821 undefined name 'ssl'
./bower_components/no-vnc/utils/websocket.py:659:28: F821 undefined name 'ssl'
./bower_components/no-vnc/utils/websocket.py:660:80: E501 line too long (86 > 79 characters)
./bower_components/no-vnc/utils/websocket.py:660:86: E703 statement ends with a semicolon
./bower_components/no-vnc/utils/websocket.py:668:21: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:676:15: E271 multiple spaces after keyword
./bower_components/no-vnc/utils/websocket.py:691:28: F821 undefined name 'ssl'
./bower_components/no-vnc/utils/websocket.py:713:25: E701 multiple statements on one line (colon)
./bower_components/no-vnc/utils/websocket.py:715:25: E701 multiple statements on one line (colon)
./bower_components/no-vnc/utils/websocket.py:722:17: F821 undefined name 'resource'
./bower_components/no-vnc/utils/websocket.py:722:36: F821 undefined name 'resource'
./bower_components/no-vnc/utils/websocket.py:723:21: F821 undefined name 'resource'
./bower_components/no-vnc/utils/websocket.py:723:43: E701 multiple statements on one line (colon)
./bower_components/no-vnc/utils/websocket.py:730:44: E701 multiple statements on one line (colon)
./bower_components/no-vnc/utils/websocket.py:756:1: W293 blank line contains whitespace
./bower_components/no-vnc/utils/websocket.py:757:9: E303 too many blank lines (2)
./bower_components/no-vnc/utils/websocket.py:762:9: E265 block comment should start with '# '
./bower_components/no-vnc/utils/websocket.py:775:20: F821 undefined name 'ssl'
./bower_components/no-vnc/utils/websocket.py:782:27: F821 undefined name 'ssl'
./bower_components/no-vnc/utils/websocket.py:783:25: E126 continuation line over-indented for hanging indent
./bower_components/no-vnc/utils/websocket.py:787:20: F821 undefined name 'ssl'
./bower_components/no-vnc/utils/websocket.py:789:33: F821 undefined name 'ssl'
./bower_components/no-vnc/utils/websocket.py:831:5: E303 too many blank lines (2)
./bower_components/no-vnc/utils/websocket.py:840:9: E265 block comment should start with '# '
./bower_components/no-vnc/utils/websocket.py:847:80: E501 line too long (101 > 79 characters)
./bower_components/no-vnc/utils/websocket.py:870:26: W291 trailing whitespace
./bower_components/no-vnc/utils/websocket.py:897:80: E501 line too long (82 > 79 characters)
./bower_components/no-vnc/utils/websocket.py:939:80: E501 line too long (80 > 79 characters)
./bower_components/no-vnc/utils/websocket.py:944:37: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:955:80: E501 line too long (82 > 79 characters)
./bower_components/no-vnc/utils/websocket.py:956:80: E501 line too long (81 > 79 characters)
./bower_components/no-vnc/utils/websocket.py:957:45: E127 continuation line over-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:987:50: E203 whitespace before ':'
./bower_components/no-vnc/utils/websocket.py:989:41: E128 continuation line under-indented for visual indent
./bower_components/no-vnc/utils/websocket.py:994:37: E126 continuation line over-indented for hanging indent
./bower_components/no-vnc/utils/websocket.py:1030:1: W391 blank line at end of file
./dashboard/migrations/0001_initial.py:26:80: E501 line too long (114 > 79 characters)
./dashboard/migrations/0001_initial.py:27:80: E501 line too long (200 > 79 characters)
./dashboard/migrations/0001_initial.py:28:80: E501 line too long (125 > 79 characters)
./dashboard/migrations/0001_initial.py:29:80: E501 line too long (300 > 79 characters)
./dashboard/migrations/0001_initial.py:30:80: E501 line too long (101 > 79 characters)
./dashboard/migrations/0001_initial.py:39:80: E501 line too long (114 > 79 characters)
./dashboard/migrations/0001_initial.py:50:80: E501 line too long (114 > 79 characters)
./dashboard/migrations/0001_initial.py:51:80: E501 line too long (129 > 79 characters)
./dashboard/migrations/0001_initial.py:61:80: E501 line too long (114 > 79 characters)
./dashboard/migrations/0001_initial.py:62:80: E501 line too long (161 > 79 characters)
./dashboard/migrations/0001_initial.py:74:80: E501 line too long (114 > 79 characters)
./dashboard/migrations/0001_initial.py:75:80: E501 line too long (140 > 79 characters)
./dashboard/migrations/0001_initial.py:76:80: E501 line too long (147 > 79 characters)
./dashboard/migrations/0001_initial.py:77:80: E501 line too long (192 > 79 characters)
./dashboard/migrations/0001_initial.py:91:80: E501 line too long (114 > 79 characters)
./dashboard/migrations/0001_initial.py:92:80: E501 line too long (174 > 79 characters)
./dashboard/migrations/0001_initial.py:93:80: E501 line too long (165 > 79 characters)
./dashboard/migrations/0001_initial.py:95:80: E501 line too long (165 > 79 characters)
./dashboard/migrations/0001_initial.py:96:80: E501 line too long (180 > 79 characters)
./dashboard/migrations/0001_initial.py:97:80: E501 line too long (204 > 79 characters)
./dashboard/migrations/0001_initial.py:98:80: E501 line too long (148 > 79 characters)
./dashboard/migrations/0001_initial.py:102:80: E501 line too long (80 > 79 characters)
./dashboard/migrations/0002_auto_20150318_1317.py:4:1: F401 'models' imported but unused
./dashboard/migrations/0002_auto_20150318_1317.py:28:80: E501 line too long (107 > 79 characters)
./dashboard/migrations/0003_message.py:19:80: E501 line too long (114 > 79 characters)
./dashboard/migrations/0003_message.py:20:80: E501 line too long (140 > 79 characters)
./dashboard/migrations/0003_message.py:21:80: E501 line too long (147 > 79 characters)
./dashboard/migrations/0003_message.py:22:80: E501 line too long (93 > 79 characters)
./dashboard/migrations/0003_message.py:23:80: E501 line too long (89 > 79 characters)
./dashboard/migrations/0003_message.py:24:80: E501 line too long (86 > 79 characters)
./dashboard/migrations/0003_message.py:25:80: E501 line too long (202 > 79 characters)
./dashboard/migrations/0003_message.py:26:80: E501 line too long (88 > 79 characters)
./setty/migrations/0001_initial.py:20:80: E501 line too long (114 > 79 characters)
./setty/migrations/0001_initial.py:30:80: E501 line too long (114 > 79 characters)
./setty/migrations/0001_initial.py:34:80: E501 line too long (89 > 79 characters)
./setty/migrations/0001_initial.py:35:80: E501 line too long (89 > 79 characters)
./setty/migrations/0001_initial.py:41:80: E501 line too long (114 > 79 characters)
./setty/migrations/0001_initial.py:45:80: E501 line too long (182 > 79 characters)
./setty/migrations/0001_initial.py:51:80: E501 line too long (114 > 79 characters)
./setty/migrations/0002_elementtemplate_description.py:19:80: E501 line too long (106 > 79 characters)
./setty/migrations/0003_auto_20150701_1621.py:4:1: F401 'models' imported but unused
./setty/migrations/0004_service_status.py:19:80: E501 line too long (120 > 79 characters)
./setty/migrations/0005_elementtemplate_compatibles.py:17:80: E501 line too long (103 > 79 characters)
./setty/migrations/0008_auto_20150827_1044.py:18:80: E501 line too long (98 > 79 characters)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment