Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
dfdd040c265a60d45352ad9acbe4400ea3d6ab2f
[simgrid.git] / teshsuite / python / platform-mix / platform-mix.py
1 # Copyright (c) 2006-2022. The SimGrid Team. All rights reserved.
2 #
3 # This program is free software; you can redistribute it and/or modify it
4 # under the terms of the license (GNU LGPL) which comes with this package.
5
6 from simgrid import Actor, Engine, Host, Mailbox, NetZone, LinkInRoute, this_actor
7 import sys
8
9 class Sender:
10   """
11   Send 1 message for each host
12   """
13   def __init__(self, hosts):
14     self.hosts = hosts
15
16   # Actors that are created as object will execute their __call__ method.
17   # So, the following constitutes the main function of the Sender actor.
18   def __call__(self):
19
20     for host in self.hosts:
21       mbox = Mailbox.by_name(host.name)
22       msg = "Hello. I'm " + str(this_actor.get_host().name)
23       size = int(1e6)
24       this_actor.info("Sending msg to " + host.name)
25       mbox.put(msg, size)
26
27     this_actor.info("Done dispatching all messages. Goodbye!")
28
29 class Receiver:
30   """
31   Receiver actor: wait for 1 messages and do operations
32   """
33
34   def __call__(self):
35     this_actor.execute(1e9)
36     for disk in Host.current().get_disks():
37       this_actor.info("Using disk " + disk.name)
38       disk.read(10000)
39       disk.write(10000)
40     mbox = Mailbox.by_name(this_actor.get_host().name)
41     msg = mbox.get()
42     this_actor.info("I got '%s'." % msg)
43     this_actor.info("Finished executing. Goodbye!")
44
45 def load_platform():
46   """ Creates a mixed platform, using many methods available in the API
47   """
48
49   root = NetZone.create_floyd_zone("root")
50   hosts = []
51   # dijkstra
52   dijkstra = NetZone.create_dijkstra_zone("dijkstra")
53   msg_base = "Creating zone: "
54   this_actor.info(msg_base + dijkstra.name)
55   dijkstra.set_parent(root)
56   host1 = dijkstra.create_host("host1", [1e9, 1e8]).set_core_count(2)
57   hosts.append(host1)
58   host1.create_disk("disk1", 1e5, 1e4).seal()
59   host1.create_disk("disk2", "1MBps", "1Mbps").seal()
60   host1.seal()
61   host2 = dijkstra.create_host("host2", ["1Gf", "1Mf"]).seal()
62   hosts.append(host2)
63   link1 = dijkstra.create_link("link1_up", [1e9]).set_latency(1e-3).set_concurrency_limit(10).seal()
64   link2 = dijkstra.create_link("link1_down", ["1GBps"]).set_latency("1ms").seal()
65   dijkstra.add_route(host1.get_netpoint(), host2.get_netpoint(), None, None, [LinkInRoute(link1)], False)
66   dijkstra.add_route(host2.get_netpoint(), host1.get_netpoint(), None, None, [LinkInRoute(link2)], False)
67   dijkstra.seal()
68
69   # vivaldi
70   vivaldi = NetZone.create_vivaldi_zone("vivaldi")
71   this_actor.info(msg_base + vivaldi.name)
72   vivaldi.set_parent(root)
73   host3 = vivaldi.create_host("host3", 1e9).set_coordinates("1 1 1").seal()
74   host4 = vivaldi.create_host("host4", "1Gf").set_coordinates("2 2 2").seal()
75   hosts.append(host3)
76   hosts.append(host4)
77
78   # empty
79   empty = NetZone.create_empty_zone("empty")
80   this_actor.info(msg_base + empty.name)
81   empty.set_parent(root)
82   host5 = empty.create_host("host5", 1e9)
83   hosts.append(host5)
84   empty.seal()
85
86   # wifi
87   wifi = NetZone.create_wifi_zone("wifi")
88   this_actor.info(msg_base + wifi.name)
89   wifi.set_parent(root)
90   router = wifi.create_router("wifi_router")
91   wifi.set_property("access_point", "wifi_router")
92   host6 = wifi.create_host(
93       "host6", ["100.0Mf", "50.0Mf", "20.0Mf"]).seal()
94   hosts.append(host6)
95   wifi_link = wifi.create_link("AP1", ["54Mbps", "36Mbps", "24Mbps"]).seal()
96   wifi_link.set_host_wifi_rate(host6, 1)
97   wifi.seal()
98
99   # create routes between netzones
100   link_a = vivaldi.create_link("linkA", 1e9).seal()
101   link_b = vivaldi.create_link("linkB", "1GBps").seal()
102   link_c = vivaldi.create_link("linkC", "1GBps").seal()
103   root.add_route(dijkstra.get_netpoint(), vivaldi.get_netpoint(
104   ), host1.get_netpoint(), host3.get_netpoint(), [LinkInRoute(link_a)], True)
105   root.add_route(vivaldi.get_netpoint(), empty.get_netpoint(
106   ), host3.get_netpoint(), host5.get_netpoint(), [LinkInRoute(link_b)], True)
107   root.add_route(empty.get_netpoint(), wifi.get_netpoint(
108   ), host5.get_netpoint(), router, [LinkInRoute(link_c)], True)
109
110   # create actors Sender/Receiver
111   Actor.create("sender", hosts[0], Sender(hosts))
112   for host in hosts:
113     Actor.create("receiver", host, Receiver())
114
115 ###################################################################################################
116
117 if __name__ == '__main__':
118   e = Engine(sys.argv)
119
120   # create platform
121   load_platform()
122
123   # runs the simulation
124   e.run()