Exemple #1
0
def data_init(nodes_file, matrix_file):
    """ 从文件读入网络数据 """

    # 读取节点信息
    node_list = []
    node_name = {}
    node_pos = {}

    with open(nodes_file) as fn:
        reader = csv.reader(fn)
        next(reader)
        for i, line in enumerate(reader):
            node_name[line[0]] = i
            node_list.append(ni.Node(i, int(line[3]), float(line[4])))
            node_pos[i] = np.array([float(line[1]), float(line[2])])

    # 读取网络信息
    bandwidth = [[0 for col in range(len(node_name))]
                 for row in range(len(node_name))]
    adj = [[0 for col in range(len(node_name))]
           for row in range(len(node_name))]

    with open(matrix_file) as fm:
        reader = csv.reader(fm)
        next(reader)
        for i, line in enumerate(reader):
            bandwidth[node_name[line[1]]][node_name[line[2]]] = int(line[3])
            bandwidth[node_name[line[2]]][node_name[line[1]]] = int(line[3])
            adj[node_name[line[1]]][node_name[line[2]]] = 1
            adj[node_name[line[2]]][node_name[line[1]]] = 1

    return node_list, bandwidth, adj, node_pos
 def getStaticInfo(self):
     staticInformation = {}
     try:
         staticInformation["MAC Address"] = NetworkInfo.getMAC()
     except:
         pass
     try:
         cpuInfo = CPUInfo.getCPUInfo()
         staticInformation["Serial Number"] = cpuInfo['Serial'][0]
         staticInformation["Hardware"] = cpuInfo['Hardware'][0]
         staticInformation[
             "Manufacturer"] = ManufatcurerInfo.getManufaturerInfo(
                 cpuInfo["Revision"][0])
     except Exception as e:
         pass
     try:
         osInfo = OSInfo.getOSInfo()
         staticInformation["OS"] = {}
         staticInformation["Hostname"] = osInfo["Hostname"]
         staticInformation["OS"]["Name"] = osInfo["NAME"]
         staticInformation["OS"]["Type"] = osInfo["ID_LIKE"]
         staticInformation["OS"]["Version Number"] = osInfo["VERSION_ID"]
         staticInformation["OS"]["Architecture"] = osInfo["Architecture"]
         staticInformation["OS"]["Version"] = osInfo["OS Version"]
         staticInformation["OS"]["Release"] = osInfo["OS Release"]
     except Exception as e:
         pass
     return staticInformation
Exemple #3
0
def add_instance(bandwidth, node_list, instance_registry, instance_num, request, request_placement, nf_index):

    """ 为指定nf增加一个实例 """

    # 找距离前驱和后继Node距离之和最小的Node
    vector = get_placement_vector(request, request_placement)
    pre_nodes = vector[nf_index]
    post_nodes = vector[nf_index + 2]
    candidate_nodes_distance = [[i, 0] for i in range(len(node_list))]
    for v in range(len(node_list)):
        distance_sum = 0
        for pre in pre_nodes:
            distance_sum += distance(bandwidth, pre, v)
        for post in post_nodes:
            distance_sum += distance(bandwidth, v, post)
        candidate_nodes_distance[v][1] = distance_sum
    # 排除已有同类实例的Node
    for u in vector[nf_index + 1]:
        candidate_nodes_distance[u][1] = float("inf")
    # 按照距离远近排序
    candidate_nodes_distance = sorted(sorted(candidate_nodes_distance, key=lambda n: node_list[n[0]].avail, reverse=True), key=lambda n: n[1])
    candidate_nodes = [n[0] for n in candidate_nodes_distance]
    nf_id = request.nf_list[nf_index]
    for v in candidate_nodes:
        # 如果已经有同类实例,且capacity还有剩余
        same_instance = None
        for instance in node_list[v].instances:
            if instance.type == nf_id and instance.capacity > 0:
                same_instance = instance
        if same_instance is not None:
            # 在表中登记这个新实例
            request_placement[request.id][nf_index][v] = same_instance
            break

        elif node_list[v].CPU > Global.NF_CPU_REQUIREMENT[nf_id] and v not in vector[nf_index + 1]:
            # 在request_placement中部署
            new_instance = ni.Instance(instance_num[nf_id], nf_id)
            instance_num[nf_id] += 1
            new_instance.placement = v
            request_placement[request.id][nf_index][v] = new_instance
            instance_registry[nf_id].append(new_instance)
            # 更新Node
            node_list[v].CPU -= Global.NF_CPU_REQUIREMENT[nf_id]
            node_list[v].instances.append(new_instance)
            break
    # 没有满足资源需求的Node了
    else:
        raise AssertionError("No CPU to satisfy Availability!")
Exemple #4
0
def get_requests(request_num, nf_list_length, rate, avail):
    """ 随机生成请求集合 """

    request_list = []

    src_list = [1, 34, 37, 31, 3, 11, 8, 40, 32]
    dst_list = [36, 48, 0, 29, 28, 46, 24, 38]

    for i in range(request_num):
        r = ni.Request(
            i, random.choice(src_list), random.choice(dst_list),
            random.sample(range(Global.NF_TYPE_NUM),
                          random.randint(nf_list_length[0],
                                         nf_list_length[1])),
            random.randint(rate[0], rate[1]),
            random.uniform(avail[0], avail[1]))
        request_list.append(r)

    return request_list
Exemple #5
0
import SystemDrives as sd
import OsInfo as oi
import NetworkInfo as ni
import SoftwareInfo as si

print('{:*^65s}'.format('Operating System Information'))
o1 = oi.OsInfo()
for i in o1.Osinfo().items():
    print('{}:{}'.format(i[0], i[1]))

print('\n\n{:*^65s}'.format('Drives On System'))
s1 = sd.SystemDrives()
for s in s1.GetDrives():
    print('{}'.format(s))

print('\n\n{:*^65s}'.format('Network Information'))
n1 = ni.NetworkInfo()
for i in n1.networkinfo().items():
    print('{}:{}'.format(i[0], i[1]))

print('\n\n{:*^65s}'.format('Installed Software'))
s1 = si.SoftwareInfo()
i = 1
print('{} Softwares installed'.format(s1.softwareinfo()['count']))
for s in s1.softwareinfo()['lists']:
    print(s)
Exemple #6
0
def extend_deploy(bandwidth_origin, node_list, request_list):
    """ 扩展部署算法 """

    # 剩余带宽矩阵
    bandwidth = copy.copy(bandwidth_origin)

    # 储存每个请求的带宽消耗矩阵
    flow_matrix_request = {}

    # 实例注册表(每种NF一个子表)
    instance_registry = [[] for i in range(Global.NF_TYPE_NUM)]

    # 每个请求选择的部署位置
    request_placement = []

    # 每个类型nf实例个数
    instance_num = [0] * Global.NF_TYPE_NUM

    # 初始化 request_placement, 并将请求排序(按照流量速率/可用性要求)
    # TODO:排序依据加上NF表长度
    rate_sum = sum(request.rate for request in request_list)
    avail_max = max(request.avail for request in request_list)
    avail_min = min(request.avail for request in request_list)
    for r in request_list:
        request_placement.append([{} for nf in r.nf_list])
        if avail_max == avail_min:
            r.rank = r.rate / float(rate_sum)
        else:
            r.rank = r.rate / float(rate_sum) + (r.avail - avail_min) / (
                avail_max - avail_min)
    request_list = sorted(request_list, key=lambda r: r.rank, reverse=True)
    """ 依次部署请求 """
    for request in request_list:

        # 找离源点和汇点最近的Node
        candidate_nodes_distance = []
        for v in range(len(node_list)):
            candidate_nodes_distance.append(
                (v, util.distance(bandwidth, request.src, v) +
                 util.distance(bandwidth, v, request.dst)))
        candidate_nodes_distance = sorted(sorted(
            candidate_nodes_distance,
            key=lambda n: node_list[n[0]].avail,
            reverse=True),
                                          key=lambda n: n[1])
        # 按照距离源汇点距离之和远近进行排序后的Node表
        candidate_nodes = [n[0] for n in candidate_nodes_distance]
        """ 对每个要部署的nf(第i个)放置第一个实例 """
        for i, nf in enumerate(request.nf_list):
            # 在候选表中依次选择
            for v in candidate_nodes:
                # 如果已经有同类实例,且capacity还有剩余
                same_instance = None
                for instance in node_list[v].instances:
                    if instance.type == nf and instance.capacity > 0:
                        same_instance = instance
                if same_instance is not None:
                    # 在表中登记这个新实例
                    request_placement[request.id][i][v] = same_instance
                    break

                # 如果没有同类实例
                elif node_list[v].CPU > Global.NF_CPU_REQUIREMENT[nf]:
                    # 新建一个实例,并放置在当前Node
                    new_instance = ni.Instance(instance_num[nf], nf)
                    instance_num[nf] += 1
                    new_instance.placement = v
                    # 在两个表中登记这个新实例
                    request_placement[request.id][i][v] = new_instance
                    instance_registry[nf].append(new_instance)
                    # 更新Node
                    node_list[v].CPU -= Global.NF_CPU_REQUIREMENT[nf]
                    node_list[v].instances.append(new_instance)
                    break
            # 没有满足资源需求的Node了
            else:
                raise AssertionError("No CPU!")

        # 计算可用性
        avail_bottleneck_index = util.get_avail(request, node_list,
                                                request_placement)
        # 所有使用的实例剩余capacity总和
        capacity_bottleneck_index = util.get_rest_capacity(
            request, request_placement)

        # 可用性拉满
        while (1):
            # 如果可用性不足
            if avail_bottleneck_index > -1:
                util.add_instance(bandwidth, node_list, instance_registry,
                                  instance_num, request, request_placement,
                                  avail_bottleneck_index)
                # 计算可用性
                avail_bottleneck_index = util.get_avail(
                    request, node_list, request_placement)
            else:
                break

        # 剩余capacity拉满
        while (1):
            # 如果capacity不足
            if capacity_bottleneck_index > -1:
                util.add_instance(bandwidth, node_list, instance_registry,
                                  instance_num, request, request_placement,
                                  capacity_bottleneck_index)
                # 计算可用性
                capacity_bottleneck_index = util.get_rest_capacity(
                    request, request_placement)
            else:
                break
        """ 根据部署位置计算链的网络流 """
        flow_matrix = util.get_route(bandwidth, request, request_placement)
        flow_matrix_request[request.id] = flow_matrix
        bandwidth = (np.mat(bandwidth) - np.mat(flow_matrix)).tolist()
    """ 部署完毕 """

    return request_placement, instance_num, bandwidth, flow_matrix_request
Exemple #7
0
    return cost


if __name__ == "__main__":

    bandwidth = [[0, 100, 0, 0, 100, 0, 100, 0],
                 [100, 0, 100, 0, 100, 100, 0, 0],
                 [0, 100, 0, 100, 100, 0, 0, 0],
                 [0, 0, 100, 0, 0, 100, 0, 100],
                 [100, 100, 100, 0, 0, 100, 100, 0],
                 [0, 100, 0, 100, 100, 0, 100, 100],
                 [100, 0, 0, 0, 100, 100, 0, 100],
                 [0, 0, 0, 100, 0, 100, 100, 0]]

    node_list = [
        ni.Node(0, 100, 0.9),
        ni.Node(1, 100, 0.9),
        ni.Node(2, 100, 0.9),
        ni.Node(3, 100, 0.9),
        ni.Node(4, 100, 0.9),
        ni.Node(5, 100, 0.9),
        ni.Node(6, 100, 0.8),
        ni.Node(7, 100, 0.8),
    ]

    request_list = [
        ni.Request(0, 0, 7, [1, 2, 3], 20, 0.95),
        ni.Request(1, 0, 3, [2, 3], 15, 0.9)
    ]

    # d = distance(bandwidth, 0, 3)
def random_deploy(bandwidth_origin, node_list, request_list):
    """ 随机部署算法 """

    # 剩余带宽矩阵
    bandwidth = copy.copy(bandwidth_origin)

    # 储存每个请求的带宽消耗矩阵
    flow_matrix_request = {}

    # 实例注册表(每种NF一个子表)
    instance_registry = [[] for i in range(Global.NF_TYPE_NUM)]

    # 每个请求选择的部署位置
    request_placement = []
    for r in request_list:
        request_placement.append([{} for nf in r.nf_list])

    # 每个类型nf实例个数
    instance_num = [0] * Global.NF_TYPE_NUM
    """ 依次部署请求 """
    for request in request_list:
        # 依次部署请求中的nf
        for i, nf in enumerate(request.nf_list):
            # 随机选择一个点
            sample_node = random.sample(range(len(node_list)), len(node_list))
            # 直到满足资源需求
            for v in sample_node:
                if node_list[v].CPU > Global.NF_CPU_REQUIREMENT[nf]:
                    # 新建一个实例,并放置在当前Node
                    new_instance = ni.Instance(instance_num[nf], nf)
                    instance_num[nf] += 1
                    new_instance.placement = v
                    # 在两个表中登记这个新实例
                    request_placement[request.id][i][v] = new_instance
                    instance_registry[nf].append(new_instance)
                    # 更新Node
                    node_list[v].CPU -= Global.NF_CPU_REQUIREMENT[nf]
                    node_list[v].instances.append(new_instance)
                    break

            # 没有满足资源需求的Node了
            else:
                raise AssertionError("No CPU!")

        # 计算可用性
        avail_bottleneck_index = util.get_avail(request, node_list,
                                                request_placement)
        # 所有使用的实例剩余capacity总和
        capacity_bottleneck_index = util.get_rest_capacity(
            request, request_placement)

        # 可用性和剩余capacity拉满
        while avail_bottleneck_index > -1 or capacity_bottleneck_index > -1:

            if avail_bottleneck_index > -1:
                bottleneck_index = avail_bottleneck_index
            elif capacity_bottleneck_index > -1:
                bottleneck_index = capacity_bottleneck_index
            else:
                break

            # placed_nodes = request_placement[request.id][bottleneck_index].keys()
            # # 随机选择一个点
            # sample_node = random.sample(range(len(node_list)), len(node_list))
            # # 直到满足资源需求
            # for v in sample_node:
            #     if v not in placed_nodes:
            #         # 如果已经有同类实例,且capacity还有剩余
            #         same_instance = None
            #         for instance in node_list[v].instances:
            #             if instance.type == nf and instance.capacity > 0:
            #                 same_instance = instance
            #         if same_instance is not None:
            #             # 在表中登记这个新实例
            #             request_placement[request.id][bottleneck_index][v] = same_instance
            #             break
            #
            #         # 如果没有同类实例
            #         elif node_list[v].CPU > Global.NF_CPU_REQUIREMENT[nf]:
            #             # 新建一个实例,并放置在当前Node
            #             new_instance = ni.Instance(instance_num[nf], nf)
            #             instance_num[nf] += 1
            #             new_instance.placement = v
            #             # 在两个表中登记这个新实例
            #             request_placement[request.id][bottleneck_index][v] = new_instance
            #             instance_registry[nf].append(new_instance)
            #             # 更新Node
            #             node_list[v].CPU -= Global.NF_CPU_REQUIREMENT[nf]
            #             node_list[v].instances.append(new_instance)
            #             break
            #
            # # 没有满足资源需求的Node了
            # else:
            #     raise AssertionError("No CPU!")
            """ 增加实例时随机选点有bug,暂时使用更优的部分extend策略 """
            util.add_instance(bandwidth, node_list, instance_registry,
                              instance_num, request, request_placement,
                              bottleneck_index)

            # 计算可用性和剩余capacity
            avail_bottleneck_index = util.get_avail(request, node_list,
                                                    request_placement)
            capacity_bottleneck_index = util.get_rest_capacity(
                request, request_placement)
        """ 根据部署位置计算链的网络流 """
        flow_matrix = util.get_route(bandwidth, request, request_placement)
        flow_matrix_request[request.id] = flow_matrix
        bandwidth = (np.mat(bandwidth) - np.mat(flow_matrix)).tolist()
    """ 部署完毕 """

    return request_placement, instance_num, bandwidth, flow_matrix_request
Exemple #9
0
from HeartBeat import HeartBeat
import NetworkInfo
import time

# Get Network Settings
current_hostname, current_ip, current_broadcast = NetworkInfo.get_network_info(
)
port = 50002
print("\n", "+-------------------------------+", "\n",
      "| Network Settings              |", "\n",
      "+-------------------------------+", "\n", "| IP Address = ", current_ip,
      "\n", "| Broadcast  = ", current_broadcast, "\n", "| Port       = ",
      port, "\n", "+-------------------------------+", "\n")
current_ip = input(
    'Press enter to start the node or enter an ip address manually:'
) or current_ip
continue_flag = "continue"
# Initialize Node
while continue_flag != "exit":
    node = HeartBeat(name=current_hostname,
                     ip=current_ip,
                     broadcast=current_broadcast,
                     port=port,
                     heartbeat_interval=2,
                     ttl=2,
                     debug=False)
    ## Start Node
    print("Starting Node ...\n")
    #while continue_flag:
    try:
        node.start()
 def __init__(self):
     self.net = NetworkInfo.NetInfo()
     self.disk = DiskInfo.DiskInfo()
     self.cpu = CpuInfo.CpuInfo()