changeset 59:c4f8630b7822

topology manager fix
author KaitoMaeshiro <aosskaito@cr.ie.u-ryukyu.ac.jp>
date Thu, 27 Jan 2022 01:19:51 +0900
parents 0d2c956060d8
children 14222beab95b
files Test/Topology/TreeTestTopology/ChildCodeGear.cs Test/Topology/TreeTestTopology/ParentCodeGear.cs Test/Topology/TreeTestTopology/StartTreeTestTopology.cs topology/HostMessage.cs topology/TopologyDataGear.cs topology/manager/CheckComingHost.cs topology/manager/ConfigWaiter.cs topology/manager/CreateTreeTopology.cs topology/manager/IncomingHosts.cs topology/manager/Parent.cs topology/manager/ParentManager.cs topology/manager/RecordTopology.cs topology/manager/SearchHostName.cs topology/manager/StartTopologyManager.cs topology/manager/TopologyManager.cs topology/manager/TopologyManagerConfig.cs topology/manager/TopologyType.cs topology/node/ConfigurationFinish.cs topology/node/CreateConnectionList.cs topology/node/IncomingConnectionInfo.cs topology/node/PrepareToClose.cs topology/node/Start.cs topology/node/StartTopologyNode.cs topology/node/TopologyNode.cs topology/node/TopologyNodeConfig.cs
diffstat 24 files changed, 501 insertions(+), 65 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Test/Topology/TreeTestTopology/ChildCodeGear.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using Christie_net.annotation;
+using Christie_net.codegear;
+using Christie_net.topology;
+
+
+namespace Christie_net.Test.Topology.TreeTestTopology
+{
+    public class ChildCodeGear : CodeGear
+    {
+        [Peek] public TopologyDataGear topoDG;
+
+        public override void Run(CodeGearManager cgm)
+        {
+            List<String> _CLIST = topoDG.getConnectionList();
+            if(_CLIST.Contains("parent")) {
+                GetDgm("parent").Put("childNodeName", topoDG.getNodeName());
+            }else{
+                GetLocalDgm().Put("countNodeNum", 1);
+                cgm.Setup(new ParentCodeGear());
+            }
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Test/Topology/TreeTestTopology/ParentCodeGear.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -0,0 +1,30 @@
+using System;
+using Christie_net.annotation;
+using Christie_net.codegear;
+using Christie_net.topology.node;
+using Christie_net.topology;
+
+
+
+namespace Christie_net.Test.Topology.TreeTestTopology
+{
+    public class ParentCodeGear : CodeGear
+    {
+        [Peek] public TopologyDataGear topoDG;
+        [Peek] public int maxNodeNum;
+        [Peek] public TopologyNodeConfig topologyNodeConfig;
+        [Take] public int countNodeNum;
+        [Take] public String childNodeName;
+
+        public override void Run(CodeGearManager cgm)
+        {
+            Console.WriteLine(topoDG.getNodeName() + " : " + childNodeName + " accept");
+            if(countNodeNum == maxNodeNum){
+                GetDgm(topologyNodeConfig.getManagerKey()).Put("FINISHMESSAGE", new Message());
+            }else{
+                GetLocalDgm().Put("countNodeNum", countNodeNum + 1);
+                cgm.Setup(new ParentCodeGear());
+            }
+        }
+    }
+}
\ No newline at end of file
--- a/Test/Topology/TreeTestTopology/StartTreeTestTopology.cs	Tue Jan 25 22:35:25 2022 +0900
+++ b/Test/Topology/TreeTestTopology/StartTreeTestTopology.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -0,0 +1,32 @@
+using System;
+using Christie_net.codegear;
+using Christie_net.topology.manager;
+using Christie_net.topology.node;
+
+
+namespace Christie_net.Test.Topology.TreeTestTopology
+{
+    public class StartTreeTopology : StartCodeGear
+    {
+        public StartTreeTopology(CodeGearManager cgm) : base(cgm) { }
+
+        public static void Main(string[] args)
+        {
+            int topologyManagerPort = 10000;
+            int topologyNodePort = 10001;
+            int nodeNum = 3;
+            String[] managerArg = {"--localPort", topologyManagerPort.ToString(), "--Topology", "tree"};
+            TopologyManagerConfig topologyManagerConfig = new TopologyManagerConfig(managerArg);
+            new StartTopologyManager(topologyManagerConfig);
+
+            for (int i = 0; i < nodeNum; i++) {
+                String[] nodeArg = {
+                    "--managerPort", topologyManagerPort.ToString(),
+                    "--managerHost", "localhost",
+                    "--localPort", topologyNodePort.ToString() + i};
+                TopologyNodeConfig cs = new TopologyNodeConfig(nodeArg);
+                new StartTopologyNode(cs, new ChildCodeGear()).Put("maxNodeNum", topologyManagerConfig.hasChild);
+            }
+        }
+    }
+}
\ No newline at end of file
--- a/topology/HostMessage.cs	Tue Jan 25 22:35:25 2022 +0900
+++ b/topology/HostMessage.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -3,7 +3,7 @@
 using System.Collections.Generic;
 
 
-namespace Christie_net.topology.HostMessage {
+namespace Christie_net.topology {
     public class HostMessage /*: Cloneable*/ {
         private String hostName = "";
     private int port ;
--- a/topology/TopologyDataGear.cs	Tue Jan 25 22:35:25 2022 +0900
+++ b/topology/TopologyDataGear.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -3,7 +3,7 @@
 using System.Collections;
 using System.Collections.Generic;
 
-namespace Christie_net.topology.TopologyDataGear {
+namespace Christie_net.topology {
     
     public class TopologyDataGear /*: Cloneable*/{
     String nodeName;
--- a/topology/manager/CheckComingHost.cs	Tue Jan 25 22:35:25 2022 +0900
+++ b/topology/manager/CheckComingHost.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -2,9 +2,9 @@
 using System.Collections.Generic;
 using Christie_net.annotation;
 using Christie_net.codegear;
-using Christie_net.topology;
+using Christie_net.topology.manager;
 
-namespace Christie_net.topology.manager.CheckComingHost
+namespace Christie_net.topology.manager
 {
     public class CheckComingHost : CodeGear
     {
@@ -28,7 +28,7 @@
                     Console.WriteLine("match");
                     // coming host has ever joined this App
                     GetLocalDgm().Put("reconnectHost", hostMessage);
-                    cgm.Setup(new SearchHostName.SearchHostName());
+                    cgm.Setup(new SearchHostName());
                 }
             }
             else
--- a/topology/manager/CreateTreeTopology.cs	Tue Jan 25 22:35:25 2022 +0900
+++ b/topology/manager/CreateTreeTopology.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -3,18 +3,18 @@
 using Christie_net.daemon;
 using Christie_net.annotation;
 using Christie_net.codegear;
-using Christie_net.topology;
+using Christie_net.topology.manager;
 
 
-namespace Christie_net.topology.manager.CreateTreeTopology {
+namespace Christie_net.topology.manager {
 
     public class CreateTreeTopology : CodeGear {
-        [Take] public HostMessage.HostMessage newHost;
+        [Take] public HostMessage newHost;
         [Take] public int hostCount;
-        [Take] public Dictionary<String, HostMessage.HostMessage> nameTable;
+        [Take] public Dictionary<String, HostMessage> nameTable;
         [Take] public String MD5;
         [Take] public Dictionary<String, String> absCookieTable;
-        [Take] public ParentManager.ParentManager parentManager;
+        [Take] public ParentManager parentManager;
 
         public CreateTreeTopology()
         {
@@ -28,7 +28,7 @@
 
         cgm.CreateRemoteDGM(nodeName, newHostName, newHostPort);
 
-        TopologyDataGear.TopologyDataGear topoDG = new TopologyDataGear.TopologyDataGear();
+        TopologyDataGear topoDG = new TopologyDataGear();
         topoDG.setNodeName(nodeName);
 
         GetDgm(nodeName).Put("topoDG", topoDG);
@@ -47,7 +47,7 @@
         } else {
             // put parent information own
             String parentNodeName = parentManager.getMyParent();
-            HostMessage.HostMessage parentHost = nameTable.get(parentNodeName).clone();
+            HostMessage parentHost = nameTable.get(parentNodeName).clone();
 
 
             // 相手からhostNameとportはもらっているので, nodeの情報だけ与えれば良い.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/topology/manager/IncomingHosts.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -0,0 +1,86 @@
+using System;
+using System.Collections.Generic;
+using Christie_net.annotation;
+using Christie_net.codegear;
+using Christie_net.topology.manager;
+
+namespace Christie_net.topology.manager {
+
+    public class IncomingHosts : CodeGear
+    {
+        [Take] public Dictionary<String, LinkedList<HostMessage>> resultParse;
+        [Take] public LinkedList<String> nodeNames;
+        [Take] public Dictionary<String, String> absCookieTable;
+        [Take] public HostMessage newHost;// new coming host info
+        [Take] public String MD5;
+        [Take] public Dictionary<String, LinkedList<HostMessage>> topology;
+        [Peek] public TopologyDataGear topoDG;
+        
+        public IncomingHosts(){
+        }
+
+        public override void Run(CodeGearManager cgm)
+        {
+            // not have or match cookie
+        String nodeName = nodeNames.poll();
+        GetLocalDgm().Put("nodeNames", nodeNames);
+
+        // Manager connect to Node
+        cgm.CreateRemoteDGM(nodeName,
+                            newHost.getHostName(),
+                            newHost.getPort());
+
+        absCookieTable.put(MD5, nodeName);
+        GetLocalDgm().Put("absCookieTable", absCookieTable);
+
+        GetDgm(nodeName).put("cookie", MD5);
+
+        LinkedList<HostMessage> nodeInfoList = resultParse.get(nodeName);
+        Put(nodeName, "connectNodeNum", nodeInfoList.Count);
+        if(nodeInfoList.Count == 0) Put(nodeName,"_CONNECTIONMESSAGE", new Message());
+
+        foreach (HostMessage nodeInfo in nodeInfoList) {
+
+
+            nodeInfo.setHostAndPort(newHost);
+
+            //getLocalDGM().put("nodeInfo", nodeInfo);
+
+            //getDGM(nodeName).put("remoteNodeInfo", nodeInfo);
+            //cgm.setup(new RecordTopology());
+
+            String nodeInfoNodeName = nodeInfo.getNodeName();
+            LinkedList<HostMessage> connections;
+
+            if (!topology.ContainsKey(nodeInfoNodeName)) {
+                connections = new LinkedList<HostMessage>();
+            } else {
+                connections = topology.get(nodeInfoNodeName);
+            }
+            connections.add(nodeInfo);
+            topology.put(nodeInfoNodeName, connections);
+        }
+
+        GetLocalDgm().Put("topology", topology);
+
+
+        if (nodeNames.isEmpty()) {//文字列が空かどうかの判定
+            // configuration finish
+            foreach (String key in resultParse.keySet()) {//キーの取得
+                topoDG.setNodeName(key);
+                GetDgm(key).Put("topoDG", topoDG);
+                if(topology.ContainsKey(key)){
+                    LinkedList<HostMessage> connections = topology.get(key);
+                    foreach(HostMessage connection in connections) {
+                        Put(key, "remoteNodeInfo", connection);
+                    }
+                }
+                //put(key, "remoteNodeInfo", new HostMessage()); // end mark
+            }
+        }else{
+            cgm.Setup(new IncomingHosts());
+        }
+        GetLocalDgm().Put("resultParse", resultParse);
+        }
+    }
+}
--- a/topology/manager/Parent.cs	Tue Jan 25 22:35:25 2022 +0900
+++ b/topology/manager/Parent.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -1,7 +1,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace Christie_net.topology.manager.Parent
+namespace Christie_net.topology.manager
 {
     public class Parent
     {
--- a/topology/manager/ParentManager.cs	Tue Jan 25 22:35:25 2022 +0900
+++ b/topology/manager/ParentManager.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -2,17 +2,17 @@
 using System.Collections.Generic;
 using Christie_net.annotation;
 using Christie_net.codegear;
-using Christie_net.topology;
+using Christie_net.topology.manager;
 
-namespace Christie_net.topology.manager.ParentManager
+namespace Christie_net.topology.manager
 {
     public class ParentManager
     {
         private int maxChildren;
         private int position = 0;
-        private LinkedList<Parent.Parent> list;
+        private LinkedList<Parent> list;
         public ParentManager(int hasChildren){
-            list = new LinkedList<Parent.Parent>();
+            list = new LinkedList<Parent>();
             maxChildren = hasChildren;
         }
 
@@ -36,7 +36,7 @@
         }
 
         public void register(String name) {
-            Parent.Parent p = new Parent.Parent(name);
+            Parent p = new Parent(name);
             list.AddLast(p);
         }
 
@@ -49,17 +49,17 @@
         }
 
         public void replaceAndRemove(String remove, String replace) {
-            Parent.Parent removeNode = find(remove);
+            Parent removeNode = find(remove);
             Remove(replace);
             removeNode.setName(replace);
         }
 
         public void remove(String remove) {
-            Parent.Parent removeNode = find(remove);
+            Parent removeNode = find(remove);
             list.Remove(removeNode);
         }
 
-        public Parent.Parent find(String name) {
+        public Parent find(String name) {
             Boolean found = false;
             int i = 0;
             for (;i<list.Count;i++) {
@@ -75,14 +75,14 @@
             }
         }
 
-        public Parent.Parent getLastNode(){
+        public Parent getLastNode(){
             return list.get();
         }
 
         public void show() {
             int counter = 0;
             Console.WriteLine("| ");
-            foreach (Parent.Parent p in list) {
+            foreach (Parent p in list) {
                 if (counter==position)
                     Console.WriteLine("P ");
                 Console.WriteLine(p.getName()+" "+p.children()+" | ");
@@ -90,7 +90,7 @@
             }
         }
 
-        public LinkedList<Parent.Parent> getList() {
+        public LinkedList<Parent> getList() {
             return list;
         }
     }
--- a/topology/manager/RecordTopology.cs	Tue Jan 25 22:35:25 2022 +0900
+++ b/topology/manager/RecordTopology.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -6,19 +6,19 @@
 using Christie_net.topology;
 
 
-namespace Christie_net.topology.manager.RecordTopology {
+namespace Christie_net.topology.manager {
 
-    public class CreateTreeTopology : CodeGear {
-        [Take] public HostMessage.HostMessage nodeInfo;
-        [Take] public Dictionary<String, LinkedList<HostMessage.HostMessage>> topology;
+    public class RecordTopology : CodeGear {
+        [Take] public HostMessage nodeInfo;
+        [Take] public Dictionary<String, LinkedList<HostMessage>> topology;
         
         public override void Run(CodeGearManager cgm){
             String nodeName = nodeInfo.getNodeName();
 
-            LinkedList<HostMessage.HostMessage> connections;
+            LinkedList<HostMessage> connections;
 
             if (!topology.ContainsKey(nodeName)) {
-                connections = new LinkedList<HostMessage.HostMessage>();
+                connections = new LinkedList<HostMessage>();
             } else {
                 connections = topology.get(nodeName);
             }
--- a/topology/manager/SearchHostName.cs	Tue Jan 25 22:35:25 2022 +0900
+++ b/topology/manager/SearchHostName.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -2,14 +2,14 @@
 using System.Collections.Generic;
 using Christie_net.annotation;
 using Christie_net.codegear;
-using Christie_net.topology;
+using Christie_net.topology.manager;
 
-namespace Christie_net.topology.manager.SearchHostName {
+namespace Christie_net.topology.manager {
 
     public class SearchHostName : CodeGear
     {
-        [Take] public HostMessage.HostMessage reconnectHost;
-        [Peek] public Dictionary<String, LinkedList<HostMessage.HostMessage>> topology;
+        [Take] public HostMessage reconnectHost;
+        [Peek] public Dictionary<String, LinkedList<HostMessage>> topology;
         [Peek] public Boolean running;
         
         public SearchHostName(){
@@ -40,8 +40,8 @@
                 }
 
 
-                LinkedList<HostMessage.HostMessage> hostList = topology.get(nodeName);
-                foreach (HostMessage.HostMessage host in hostList)
+                LinkedList<HostMessage> hostList = topology.get(nodeName);
+                foreach (HostMessage host in hostList)
                 {
                     GetLocalDgm().Put(nodeName, host);
                     Console.WriteLine("put data in " + nodeName);
@@ -49,8 +49,8 @@
             }
             
             // update topology information
-            foreach (LinkedList<HostMessage.HostMessage> list in topology.Values){
-                foreach (HostMessage.HostMessage host in list){
+            foreach (LinkedList<HostMessage> list in topology.Values){
+                foreach (HostMessage host in list){
 
                     // find and update old info
                     if (!nodeName.Equals(host.getNodeName())) continue;
@@ -66,10 +66,10 @@
                 }
             }
 
-            foreach (LinkedList<HostMessage.HostMessage> list in topology.Values)
+            foreach (LinkedList<HostMessage> list in topology.Values)
             {
                 Console.WriteLine(list.get(0).getRemoteNodeName() + " : ");
-                foreach (HostMessage.HostMessage host in list)
+                foreach (HostMessage host in list)
                 {
                     Console.WriteLine("[ " + host.getNodeName() + " "
                                       + host.getHostName() + " "
--- a/topology/manager/StartTopologyManager.cs	Tue Jan 25 22:35:25 2022 +0900
+++ b/topology/manager/StartTopologyManager.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -2,28 +2,28 @@
 using System.Threading;
 using Christie_net.annotation;
 using Christie_net.codegear;
-using Christie_net.topology.node.Start;
+using Christie_net.topology.node;
 using Christie_net.topology.manager;
 
-namespace Christie_net.topology.manager.StartTopologyManager {
+namespace Christie_net.topology.manager {
     
     public class StartTopologyManager : StartCodeGear {
-        public StartTopologyManager(string[] args) : this(CreateCgm(new TopologyManagerConfig.TopologyManagerConfig(args).localPort), new TopologyManagerConfig.TopologyManagerConfig(args)){
+        public StartTopologyManager(string[] args) : this(CreateCgm(new TopologyManagerConfig(args).localPort), new TopologyManagerConfig(args)){
         }
-        public StartTopologyManager(TopologyManagerConfig.TopologyManagerConfig topologyManagerConfig) : this(CreateCgm(topologyManagerConfig.localPort), topologyManagerConfig){
+        public StartTopologyManager(TopologyManagerConfig topologyManagerConfig) : this(CreateCgm(topologyManagerConfig.localPort), topologyManagerConfig){
         }
         
-        public StartTopologyManager(CodeGearManager cgm, TopologyManagerConfig.TopologyManagerConfig topologyManagerConfig) : base(cgm) {
-            cgm.Setup(new TopologyManager.TopologyManager());
+        public StartTopologyManager(CodeGearManager cgm, TopologyManagerConfig topologyManagerConfig) : base(cgm) {
+            cgm.Setup(new TopologyManager());
             cgm.GetLocalDGM().Put("topologyManagerConfig", topologyManagerConfig);
         }
         
-        public StartTopologyManager(TopologyManagerConfig.TopologyManagerConfig conf, CodeGear startCG) :this(CreateCgm(conf.localPort), conf, startCG){
+        public StartTopologyManager(TopologyManagerConfig conf, CodeGear startCG) :this(CreateCgm(conf.localPort), conf, startCG){
 
         }
 
-        public StartTopologyManager(CodeGearManager cgm, TopologyManagerConfig.TopologyManagerConfig conf, CodeGear startCG) : base(cgm) {
-            cgm.Setup(new TopologyManager.TopologyManager());
+        public StartTopologyManager(CodeGearManager cgm, TopologyManagerConfig conf, CodeGear startCG) : base(cgm) {
+            cgm.Setup(new TopologyManager());
             cgm.Setup(new Start());
             cgm.GetLocalDGM().Put("startCG", startCG);
             cgm.GetLocalDGM().Put("topologyNodeConfig", conf);
@@ -33,7 +33,7 @@
         
         
         public static void Main(string[] args) {
-            TopologyManagerConfig.TopologyManagerConfig topologyManagerConfig = new TopologyManagerConfig.TopologyManagerConfig(args);
+            TopologyManagerConfig topologyManagerConfig = new TopologyManagerConfig(args);
             new StartTopologyManager(topologyManagerConfig);
         }
     }
--- a/topology/manager/TopologyManager.cs	Tue Jan 25 22:35:25 2022 +0900
+++ b/topology/manager/TopologyManager.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -6,31 +6,31 @@
 using Christie_net.topology;
 
 
-namespace Christie_net.topology.manager.TopologyManager {
+namespace Christie_net.topology.manager {
 
     public class TopologyManager : CodeGear {
-        [Peek] public TopologyManagerConfig.TopologyManagerConfig topologyManagerConfig;
+        [Peek] public TopologyManagerConfig topologyManagerConfig;
         
         public TopologyManager() {
         }
 
         public override void Run(CodeGearManager cgm) {
-            cgm.Setup(new CheckComingHost.CheckComingHost());
+            cgm.Setup(new CheckComingHost());
             GetLocalDgm().Put("absCookieTable", new Dictionary<String, String>());
             
             if(topologyManagerConfig.dynamic) {
                 GetLocalDgm().Put("running", true);
                 GetLocalDgm().Put("_STARTMESSAGE", new Message());
 
-                if (topologyManagerConfig.type == TopologyType.TopologyType.Tree) {
-                    GetLocalDgm().Put("parentManager", new ParentManager.ParentManager(topologyManagerConfig.hasChild));
-                    GetLocalDgm().Put("nameTable", new Dictionary<String, HostMessage.HostMessage>());
+                if (topologyManagerConfig.type == TopologyType.Tree) {
+                    GetLocalDgm().Put("parentManager", new ParentManager(topologyManagerConfig.hasChild));
+                    GetLocalDgm().Put("nameTable", new Dictionary<String, HostMessage>());
                     GetLocalDgm().Put("hostCount", 0);
-                    cgm.Setup(new CreateTreeTopology.CreateTreeTopology());
+                    cgm.Setup(new CreateTreeTopology());
                     //cgm.setup(new ReceiveDisconnectMessage());
                 }else{
                     GetLocalDgm().Put("running", false);
-                    cgm.Setup(new FileParser());
+                    //cgm.Setup(new FileParser());
                     cgm.Setup(new IncomingHosts());
                     cgm.Setup(new ConfigWaiter());
 
@@ -39,7 +39,7 @@
                 cgm.Setup(new CreateHash());
                 cgm.Setup(new TopologyFinish());
 
-                GetLocalDgm().Put("topology", new Dictionary<String, LinkedList<HostMessage.HostMessage>>());
+                GetLocalDgm().Put("topology", new Dictionary<String, LinkedList<HostMessage>>());
                 GetLocalDgm().Put("createdList", new LinkedList<String>());
 
             }
--- a/topology/manager/TopologyManagerConfig.cs	Tue Jan 25 22:35:25 2022 +0900
+++ b/topology/manager/TopologyManagerConfig.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -1,15 +1,15 @@
 using System;
 using System.Threading;
 using Christie_net.daemon;
-using Christie_net.topology;
+using Christie_net.topology.manager;
 
-namespace Christie_net.topology.manager.TopologyManagerConfig {
+namespace Christie_net.topology.manager {
 
     public class TopologyManagerConfig : Config{
         public Boolean showTime = false;
         public String confFilePath;
         public Boolean dynamic = false;
-        public TopologyType.TopologyType type = TopologyType.TopologyType.Tree;
+        public TopologyType type = TopologyType.Tree;
         public int hasChild = 2;
 
         public TopologyManagerConfig(String[] args) /*: base(args)*/ {
@@ -20,7 +20,7 @@
                     String typeName = args[++i];
                     if ("tree".Equals(typeName))
                     {
-                        type = TopologyType.TopologyType.Tree;
+                        type = TopologyType.Tree;
                     }
                 } else if ("--child".Equals(args[i])) {
                     hasChild = int.Parse(args[++i]);
--- a/topology/manager/TopologyType.cs	Tue Jan 25 22:35:25 2022 +0900
+++ b/topology/manager/TopologyType.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -1,7 +1,7 @@
 using System;
 using System.Threading;
 
-namespace Christie_net.topology.manager.TopologyType {
+namespace Christie_net.topology.manager {
     
     public enum TopologyType {
         Tree = 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/topology/node/ConfigurationFinish.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -0,0 +1,48 @@
+using System;
+using System.Threading;
+using System.Collections.Generic;
+using Christie_net.annotation;
+using Christie_net.daemon;
+using Christie_net.codegear;
+using Christie_net.topology;
+using Christie_net.topology.node;
+
+
+namespace Christie_net.topology.node
+{
+    public class ConfigurationFinish : CodeGear
+    {
+        [Take] public Message _CONNECTIONMESSAGE;
+        [Peek] public int connectNodeNum;
+        [Peek] public TopologyNodeConfig topologyNodeConfig;
+        
+        int reverseCount;
+
+        public ConfigurationFinish(){reverseCount = 0;}
+
+        public ConfigurationFinish(int reverseCount) {
+            this.reverseCount = reverseCount;
+        }
+
+        public override void Run(CodeGearManager cgm) {
+            reverseCount++;
+            if (reverseCount >= connectNodeNum) {
+                GetDgm(topologyNodeConfig.getManagerKey()).Put("_DONEMESSAGE", new Message());
+                cgm.Setup(new Start());
+
+
+                /*if (topologyNodeConfig.useKeepAlive)
+                    cgm.setup(new KeepAlive());*/
+                cgm.Setup(new PrepareToClose());
+
+                /*ClosedEventManager closedEventManager = new ClosedEventManager();
+                closedEventManager.register(cgm, DeleteConnection.class);
+                cgm.setup(closedEventManager);*/
+                return;
+
+            }else {
+                cgm.Setup(new ConfigurationFinish(reverseCount));
+            }
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/topology/node/CreateConnectionList.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -0,0 +1,19 @@
+using System;
+using Christie_net.annotation;
+using Christie_net.codegear;
+using Christie_net.topology;
+
+
+namespace Christie_net.topology.node
+{
+    public class CreateConnectionList : CodeGear
+    {
+        [Take] public String cMember;
+        [Take] public TopologyDataGear topoDG;
+
+        public override void Run(CodeGearManager cgm) {
+            topoDG.addConnection(cMember);
+            GetLocalDgm().Put("topoDG", topoDG);
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/topology/node/IncomingConnectionInfo.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -0,0 +1,38 @@
+using System;
+using Christie_net.annotation;
+using Christie_net.codegear;
+using Christie_net.topology;
+
+
+namespace Christie_net.topology.node
+{
+    public class IncomingConnectionInfo : CodeGear
+    {
+        [Take] public HostMessage remoteNodeInfo;
+        
+        int count;
+
+        public IncomingConnectionInfo() {
+            this.count = 0;
+        }
+
+        public IncomingConnectionInfo(int count) {
+            this.count = count;
+        }
+        
+        public override void Run(CodeGearManager cgm) {
+            String connectionName = remoteNodeInfo.getConnectionName();
+
+            cgm.CreateRemoteDGM(connectionName,
+                remoteNodeInfo.getHostName(),
+                remoteNodeInfo.getPort());
+
+
+            GetDgm(connectionName).Put("_CONNECTIONMESSAGE",new Message());
+            cgm.Setup(new CreateConnectionList());
+            GetLocalDgm().Put("cMember", connectionName);
+
+            cgm.Setup(new IncomingConnectionInfo(count + 1));
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/topology/node/PrepareToClose.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -0,0 +1,32 @@
+using System;
+using System.Threading;
+using System.Collections.Generic;
+using Christie_net.annotation;
+using Christie_net.daemon;
+using Christie_net.codegear;
+using Christie_net.topology;
+using Christie_net.topology.node;
+
+
+namespace Christie_net.topology.node
+{
+    public class PrepareToClose : CodeGear
+    {
+        [Take] public Message _CLOSEMESSEAGE;
+        [Peek] public TopologyDataGear topoDG;
+        
+        public PrepareToClose() {
+
+        }
+
+        public override void Run(CodeGearManager cgm) {
+            List<String> _CLIST = topoDG.getConnectionList();
+            for(String dgmName: _CLIST){
+                GetDgm(dgmName).shutdown();
+                //_CLIST.remove(dgmName);
+            }
+
+            GetLocalDgm().Finish();
+        }
+    }
+}
\ No newline at end of file
--- a/topology/node/Start.cs	Tue Jan 25 22:35:25 2022 +0900
+++ b/topology/node/Start.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -4,7 +4,7 @@
 using Christie_net.codegear;
 using Christie_net.topology;
 
-namespace Christie_net.topology.node.Start {
+namespace Christie_net.topology.node {
     
     public class Start : CodeGear
     {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/topology/node/StartTopologyNode.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -0,0 +1,22 @@
+using System;
+using System.Threading;
+using Christie_net.annotation;
+using Christie_net.codegear;
+using Christie_net.topology.manager;
+
+
+namespace Christie_net.topology.node
+{
+    public class StartTopologyNode : StartCodeGear
+    {
+        public StartTopologyNode(CodeGearManager cgm, TopologyNodeConfig conf, CodeGear startCG) : base(cgm)
+        {
+            cgm.GetLocalDGM().Put("startCG", startCG);
+            cgm.GetLocalDGM().Put("topologyNodeConfig", conf);
+            cgm.Setup(new TopologyNode());
+        }
+
+        public StartTopologyNode(TopologyNodeConfig conf, CodeGear startCG) : this(CreateCgm(conf.localPort), conf,
+            startCG){ }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/topology/node/TopologyNode.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -0,0 +1,36 @@
+using System;
+using System.Threading;
+using System.Collections.Generic;
+using Christie_net.annotation;
+using Christie_net.daemon;
+using Christie_net.codegear;
+using Christie_net.topology;
+
+
+namespace Christie_net.topology.node
+{
+    public class TopologyNode : CodeGear
+    {
+        [Peek] public TopologyNodeConfig topologyNodeConfig;
+        
+        public TopologyNode() {
+        }
+
+        public override void Run(CodeGearManager cgm) {
+
+            cgm.CreateRemoteDGM(topologyNodeConfig.getManagerKey(),
+                topologyNodeConfig.getManagerHostName(),
+                topologyNodeConfig.getManagerPort());
+
+            HostMessage hostMessage = new HostMessage();
+            hostMessage.setLocalHostAndPort(cgm.localPort);
+            hostMessage.setCookie(topologyNodeConfig.cookie);
+
+            GetDgm(topologyNodeConfig.getManagerKey()).Put("hostMessage", hostMessage);
+
+            cgm.Setup(new IncomingConnectionInfo());
+            cgm.Setup(new ConfigurationFinish());
+
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/topology/node/TopologyNodeConfig.cs	Thu Jan 27 01:19:51 2022 +0900
@@ -0,0 +1,68 @@
+using System;
+using System.Threading;
+using System.Collections.Generic;
+using Christie_net.annotation;
+using Christie_net.daemon;
+
+
+namespace Christie_net.topology.node
+{
+    public class TopologyNodeConfig : Config
+    {
+        private String managerHostName;
+        private int managerPort = 10000;
+        public String cookie;
+        private String managerKey = "manager";
+        private String localKey = "local";
+
+        public TopologyNodeConfig(String[] args) /*: base(args)*/{
+            for (int i = 0; i< args.Length; i++) {
+                if ("--managerHost".Equals(args[i])) {
+                    setManagerHostName(args[++i]);
+                } else if ("--managerKey".Equals(args[i])) {
+                    setManagerKey(args[++i]);
+                } else if ("--localKey".Equals(args[i])) {
+                    setLocalKey(args[++i]);
+                } else if ("--managerPort".Equals(args[i])) {
+                    setManagerPort(int.Parse(args[++i]));
+                } else if ("--cookie".Equals(args[i])) {
+                    cookie = args[++i];
+                }
+            }
+        }
+
+
+        public String getManagerHostName() {
+            return managerHostName;
+        }
+
+        public void setManagerHostName(String managerHostName) {
+            this.managerHostName = managerHostName;
+        }
+
+        public int getManagerPort() {
+            return managerPort;
+        }
+
+        public void setManagerPort(int managerPort) {
+            this.managerPort = managerPort;
+        }
+
+        public String getLocalKey() {
+            return localKey;
+        }
+
+        public void setLocalKey(String local) {
+            this.localKey = local;
+        }
+
+        public void setManagerKey(String manager) {
+            this.managerKey = manager;
+        }
+
+        public String getManagerKey() {
+            return managerKey;
+
+        }
+    }
+}
\ No newline at end of file