Source code for cloudmesh_client.system.rack

import json
import subprocess
import textwrap

from jinja2 import Template

from cloudmesh_client.common.util import path_expand


[docs]class Rack(object): def __init__(self, servers): self.template_string = None self.servers = servers self.diag = None self.data = None
[docs] def set_template(self, template): if template is None: self.template_string = "rackdiag {" + ''' // Change order of rack-number as ascending ascending; // define height of rack 20U; // define description of rack description = "Comet Cluster Virtualization Rack"; // define rack units 1: UPS [2U]; // define height of unit 3: Network [color=green] {% for x in range (0, 10) %} {{x+4}}: Server [''' + " ".join([ '{{server[x]["label"]}}', '{{server[x]["numbered"]}}', '{{server[x]["fontsize"]}}', '{{server[x]["shape"]}}', '{{server[x]["textcolor"]}}', '{{server[x]["color"]}}' ]) + "]" + '''{% endfor %}''' + "\n}" else: self.template_string = template self.generate_rack(self.servers)
[docs] def generate_rack(self, servers): empty = { "color": 'color="white" ', "label": "", "numbered": "", "fontsize": "", "shape": "", "textcolor": "", } self.data = [] for server in range(0, servers): self.data.append(dict(empty))
def __str__(self): return json.dumps(self.data, indent=4)
[docs] def dump(self): content = self.diag result = [] counter = 1 for line in content.split("\n"): result.append("{0:>5}: {1}".format(counter, line)) counter += 1 return '\n'.join(result)
[docs] def set(self, server, **kwargs): for attribute in kwargs: comma = ' ' if attribute is not 'color': comma = ', ' self.data[server - 1][attribute] = '{}="{}"{}' \ .format(attribute, kwargs[attribute], comma)
[docs] def set_color(self, server, color): self.set(server, color=color)
[docs] def set_label(self, server, label): self.set(server, label=label)
[docs] def set_numbering(self, server, numbering): self.set(server, numbering=numbering)
[docs] def set_fontsize(self, server, fontsize): self.set(server, fontsize=fontsize)
[docs] def set_textcolorl(self, server, textcolorl): self.set(server, textcolorl=textcolorl)
[docs] def set_shape(self, server, shape): self.set(server, shape=shape)
[docs] def render(self): template = Template(textwrap.dedent(self.template_string)) self.diag = template.render(server=self.data) return self.diag
[docs] def diagram(self, name): with open('{}.diag'.format(path_expand(name)), 'w') as f: f.write(self.diag)
[docs] def svg(self, name): self.diagram(name) cmd = ['rackdiag', "-T", "svg", "{}.diag".format(path_expand(name))] subprocess.Popen(cmd).wait()
[docs] def view(self, name): cmd = ['open', "{}.svg".format(path_expand(name))] subprocess.Popen(cmd)
if __name__ == "__main__": rack = Rack(10) rack.set_template(None) rack.set(10, color="blue") rack.set(9, color="green") rack.set(8, textcolor="red") rack.set(7, textsize="24") rack.set(7, shape="cloud") rack.set(6, numbered="1") result = rack.render() # print rack.dump() name = "~/.cloudmesh/c" rack.svg(name) rack.view(name)