openstack服务启动之nova-compute

在openstack中,消息的传递一共有两种方式,分别是:服务之间的传递调用Restful api,服务中模块之间的传递使用消息队列。每一个模块在启动是都会启动消息队列,等待队列中的有消息到来。所以模块的启动是openstack运行起来最早做的工作。以nova-compute模块为例,说明该服务模块是如何启动并运行的。

nova的架构设计图如下:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWMAAAFBCAIAAAAtxFmLAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4nOxdeXwURfZ/1d1zz2QmJ0lIAiQYIIhyKfchh3jggYgXrCvr6qr7cxUPZNcDFPFAdAGP9QARj/UAUVRWDkEF5VJBQO4jkEACARKSufuo9/ujMu2YTGYmzJBMoL9/5JOZ/k7V66rq169evVdFEBE0aNCgISy45hZAgwYNLQCaptCgQUNkaJpCgwYNkaFpCg0aNERGVJqCeT19Pt/JkyfVjyE5six7vd7T5mAtFK/H43S6EQApAqAiSbJCMfAb9kOv11tZWRm+LkmSauuijBPEDPwriqLH6wEARRaDIEmSKPqpSvJ43PV++oe6vH7ZJ/oBgFL8/UpD8kQjc1iOz+cLz/F4PFVVVbGXEw1HFMWIHLfbferUqdjLiRfH5XJVV1fHpS6/3x87x+l0RiNPxHL8fn9cODU1NTU1NerHxLIpCCGISAhvMpttNgNBRIIAhNfpBJ4jjHFaJSNBVACRlG37cdvuKoqIcHzb6l9KTkkcxwESROQFfRB0Op1eb+CKf1j43nPL9nJE4I1i9a/ffPOrQimVZUVRin9dsWu/qCiKLMkUUXaW/LR6faULCZFP7tm8dsMhSaFUkmRFob9rOQ0aWiSE5hbgD0CkhBD5xHcvT/nW3nv0zeMuMIoA+pPrZ368r8tVY4fmgqwgx7QJQfb0UUoBeEIAECkiYf8hIhLCBR5NJIgyoo4Uf/7S+7qxT3TpQAD2ffbvBedP63hdkYUqMiFk36rZr391kDeY9HodR0W37FP2kqTzc/KNnaiX09uqlk544+sONw0bxgHHAcCmz56uKBresQB4ngcApWr7Z+8tt3cclGJ1/vTlvOLsyX178cDzTAJKKcclll7WoCF6JJqmQI7jpIqtSxa9fmDt0fO6vTiggxng1PZPFn0v9b5laA7IyBlrnz2BkxUqEI7jAQEAKSEcUxPAcbWWBxEpAiASpFTged/BjWUpBWPOs5yqOsXzijnNwYk1p6pFr1tKTtNldLpsbGqN6Nz7yeyXN/mueXn6WFJJze0L22UYgIJr14qN+u5P3jeoeNn0yf/5Ce2mmqOobBq3dplCt7W5ZeGjF8igNws+n1/xrPrqi+2nCqduXlkty1KNmHrzXx65bmiWrGg2hYaWisTSFGz2IUvG9heOSG21bfZTizt8MDaNcqaUFLtZAKScUTi6f/3+CqIz2tvmd7ToDpbvP8Wntk53CISTqg6W1pjz2mQIpTtXl1RZ07Py27WzE4+XEFSQ58G/5ev9+kz47LXJxWXHff6qst2luiM7v8zk3aeyb5r04LVdUz0b3nrsb+svfvyxVy6/IEXvP3r0h3fue7r9bXP/csmJ15/6yDf0oQP/mTivYsDLn0+0A3w1Y8zJ9u/9+VoCCFu+fOrhd3+sqtG7npj+UdJvQ//1aee8vVTfLjPN9+3MJ7cfdBKSjUgjN4EGDQmJxNIUAEAIIbLbzefd+tervpgwe+6Kkf+8XK/IMlWQI/xvnz4z44PV9rZdhcpfXLZJU5/KWTT1//Z2em7mxO5S1fdP3DPj4vs+vDLl69lvrXAbvQfXJ93+5nPXdjZTiiBwhBxZ/9aXR+96/7WH2wNUrvriudnTSO6Ft818dgQPFIDzHvzq2x+4SyfdZOWW3T3kjsqMTv0GXP/YrI9zM5SaI3LrATlr37z3X9y9s9b2//mTl/ZWp/y2drdz/1vKCaqYLxh/8xOv5c+8+55NfS4pNGRef3X7jRMfX/2nmU877DWZGamHksxBMyYNGloeEnHmzAmcdMqV2emaf/wj/6unn91zwmDRIdEZfTXfzX5p9dCJS2a99NyLb/875di0T9fm3PjnLqVrvz1ByO5vPztpvHL0UJsh/fzHX5/32uyPbruk+Mevi3mdjiIR0L9n46Kvjjk6cG6fQqt+/nn3r8dbDb06s2rR57/K1O+RFWpqO/KxGc8P7yiKBzre/uLbn3+57I3HixbNe88p8kmt2w+/fMCw3ne9uvz2DorEG21Wq2X47S+MvsxhtljNZl6RlW3L1x5udWrZ0lOFlziWLVmZ2bro2PZNVDaf8ruS7MmEwOn5YjVoSASEsClCLl7C70uYGGZlJUZOYA2UCDytdul73PToyK/vfO3ZTzpabTqCvhNbqHJlr96cx+nlrOf36mL/5tdf73745vZPv711S8mpjc7CkVfqeL5kyxePPDzFoEt2VUtt+7kQATlAjyQAVzDoEqNHMvL06xXf5/QdZ125hR/Tv/zDFceevzyTUvfeDydN+mhbxYEj+wydK3usXfpJTfXRg4fKNmyXnpk97NuZL7+9te2OJ4q7dBmSR/d8v0lJMsiUGCTfyfP7XHRq149f/5Z+2QVtrr1mjLB82rfOS++5q/WXM2aXld+FPgkVBfEPN37m2lDjaByVGUdOCE1RfyGSfUOC0NCvYuQQwgEQjud5nV4ARF3h/VPuum/C9Pd+7XD5lbxgyaVk0f7iewvbmQCO7i9Rcgcmg75o2JWvLH7/Q0eNeeiwfJ04/5mnfr39jUWX9zz28j/+vN3jA+AEIKi35l989425z2xOMu7dMGPRl9ZbL6navedAZq/zfTBv4fuF944r0OXdMOvjYbt/O5pxXv6pT//13N7BLzxUqFg7OLdO/+i/ZZNm/jj68Mb1W6pT9DVfLffddPfLQ7soAPzBlZPf/N/3Sn7PXmNGbF+yXp+XUvLN8dLtH097lnjdLsvrC1pfZeuo5wkhHEcQz3gbapym56jMGDlNWVdjOSE0BQvJCAYiEkIkSaKUiqJIKQ1ZAQBQSiml9UuIkoNIOUHvdVadrKjyyoT6vUL7m27729e3XbOm4pRL1+q60Vcvfu/Rew4N7kEO/LCHG33fsHaiqPS6rNPDI97uPWr6BXmyvyq7sI3nq8/frNx66ofNh0kPiYDi8UqgCAadWzEmla9/adaO1pf+a8COd97eXOO0/u+73r2G+r+bOtc44/brne9Ne2bdka7PvdalIC/dfEyQyr6bPef9frf8/aF7TF+/++yW3afKnXxhVg6vr1m5+J0jmymC7uSevT7+fHPf7sOKS39ZonhO4vAH3h3++z3Jnz59B3JWpC6fX0cgpvaJkoNsCUmSFEU5o/2lQlEURAwvjyzLEeUJX068OKo8EcdzlHVBqKcmeo4qDyJGlCfGuqKXh3FUeRLLo0kIAURD/tUTnnHm20UgoChS9yumvfPeBtKjNSJeOfH1tOXzN5WgqejmiVddmoHHgKTzHW+cPfPC1B79HAiyZdjfZ+g++naHRPo89MIFfqFQFCXCEZQBEERPtbe64LZJE3u21cHI1vIt/+38r2mXtYWDfTuWbFw0ZdTP4qir7700ad7kW3/ZUtl+8Ph2Q666x7zwnVmTfi27pb/e3PW6eyf1sIJn0+N/X+xto8iygkD8PqfL41NElPyi1+1VKMiiU5TcPy+e89G35YCiXymY8BcEmRBSL7pTg4YWAhJyohISPp/P7XanpqaG4ciyLEmSyWQ6fQ4iEAIAst8jGMzqxz9cY+X4XKfcYlpqCtBazywCEPYnCB6Px2w2AwIQdB4plxzZKRZQFIWi5+RhpyEjzchR3mDUk+M71nuLeueB+/CvO/aL+qxO5xVaDMjxBPwlu0usHc5LAQBZFAn6T54SM1qp7eA6Xu5JzcrwO4+XlFa2Pa+DXgBCpJOHdu874gJBl9G6c7vWRqRAOJAkSZbl8O0TJUdRFKPRGIbj8Xj8fn9ycnKM5UTDYW+e8By32y1JksPhiLGceHFcLpeiKHa7Pfa6ENFgMMTIcTqdlNKI8kQsh1kKsXNYKHdSUhL7GK1HkxAS7E2pbx3Fk4PUL8oKJTzjACqyQniB4wggVRRFocBxxK9wHCsMKJWQ8DzPASIgZTkihCMgyYpaIyGcrXU2ACoUOJ7n0ZbZ1gYAoihKbidvTS/qDSDLaMnpelEOAABQACLLkmDI63AeddbUmC02ThAIp89oBUBlmQIAcII1PcsKCCjYW7cxGXRAKQXQpbY5P7VN4KYoIKEsZryJ2lDjnMMc+D1MOW6cqDyaUM/dcoY5nCAgSlTlCLrAai7heIHjAn4TVh4AJ+gCQZkECC9wfO3dUkRZpoQQRCCBcG+OY5YHUoUSjiOEEF7gERVKOUFgLCYGIcjzAiIVRVnQ6TgOAGq7C4ggCAhAEKlCgeM5QFn0iWhm98haWL0hQigA15RtqHGajqNejZHTlHU1lpNYfoozh9r75QKtUvuRq22I2k+BJLTf244AILtCaW0IaRBB/R0S9juOEAK1eob8oQtCqG4NGloOEjHySoMGDYmGc8WmaLlQJ42UUvaXEMK8jBzHhZlnSpIkSRLzgTXEYSuX4cuJhsNW0FVOMBr6oYaWBU1TJDSYq4PpCD6QwA4AOp0u4m/1en0icBTld6cyRr3QpiHRoGmKxEXw+xkANm/eXF5eXl5efuzYMbbKFaw76oPZAuFXwurroNg5iGi1Wlu3bp2enl5UVJSVlQUBladZFi0XiZX3oXGCOZRSQRAAYM2aNfPnz9+1a5csy2x/NAxax2oITMVQGi7VnT26EctpLIfneYPBoNfrTSbT4MGDb7/99uzsbCZMArbz2cdRmXHkNCLvg+f54FdcQxxZlpuGw3FcRHmi5Ki0hOIIglBaWjplypT169dnZ2ePHDmye/fueXl5bdu21ev1GMXkPxpOHIEBw6GysvLgwYMHDx5ctWrVl19+uWjRorvvvnvs2LF6vT7ivUOkfIQ4cjBgtTVBOU1ZVzTlNJYT4r3EYrPqI5r4S4YYB7F6KXw5EeWJppx4cZg8siyHieeLvi5KqcVi2blz56OPPnro0KG77rpr1KhRzIxvcdiwYcN77723dOnSG2+88d5773U4HD6fj+f5+gOvifsrYrzjOS5PnThOzU+RcFAUxWw2b968+eGHHxZFcebMmUOGDAEAWZa5QABIiwAzXHv16nXhhRfm5OTMmTPH5/P961//EgQhTBKUhsRECE2hRnrXgSiKTqezoasMLOkwvN0RL47P5/N4POHliTIPJbwtECXH5/P5fL6I8kQsBwCOHDkya9Ysl8s1a9as/v37S5LEcZwgCE08m4gFiMhMZXa/EydORMS33nqrY8eOd9xxR0O/Yqut4b2w8eK43W5FUcL3V5R1IWL4FaJoOC6Xi1IaUZ6I5YiiCJFWrKLhOJ1OALDZbOxjI/I+WAYuQ/3x2vQc1T0WO0elNTsHACilr7766oYNG2bPnt2/f39FUQRBILXnG7QMNQFB3i6e51k4xv3333/ixIkZM2Z06tSpf//+dcyKBOyL6DlNOQ6jKQci5XScBicx8z7ORQ4G3IG//PLLJ598cvfdd19xxRXscSItTU2oIEH+aaPROGHChF27dr300ks9evRQX9TqfSVOXzSWo16NkdOUdTWWo0VzJwSCtfv777+fnZ19yy23qF+2UDXBwO6CKYucnJwbb7xx//79K1asYHulkEhrvRoSBJqmSAioKvzXX39dsWLF6NGj09PTVRdmy1UTEPS25HmeUjpmzJiMjIxPP/3U5XKxb1r03Z070DRFQgADCR0ffvhhZmbm5ZdfznwTECnkqaUAEZnWM5lMN99886+//vrLL79AYPu55pZOQ2RomqL5oc4y3G73xo0bO3bsWFhYqCiKGurW3ALGASQo9eOyyy7zeDxbtmxR705TFokPTVM0P9hTxHHcxo0bfT5fnz59gj0UzS1dnEEISUtL69u37/r166urq1vW0u+5DC3vIyE4LGV73bp1iqIMHDgQguJ26xfVQsHuhVKq0+kuueSSZ555pqysLCkpiU27EqcvzgKOyowjJ7HO+zhnOWyiUVxcnJyc3K5dO2w4tr+lg1LK83yXLl3cbndpaWmnTp2CJ1mJ0BenwVGZMXKasq7GchLrvI8oOdjk51mcUXnYa7aiouLkyZOFhYWqFo9RU2CI+QsBdo4A+X0Pv6a0XNRhZ7fbc3Nzd+7cOXjwYHa/7HvtvI+EPe9D81MkCsrKyk6cONGpUydoWNlHCQRk230i0uBXFQCq/6lVRKgoYIOy6ED1i9MULGArJScnt2nTZvfu3Ww4akh8hLApGopyZwovfKw4y7MIHycfL46iKLIsR4y3l2U5Ytx+XDiKoiiKchrysGWOmpqampoai8VSzxBoHBCQIAECSCnhOADZWe1UEPRmh1lPgMqSDLxOIEgR2AGIYW2KgDr5fa/iGFQYCayACIJgNBrLyso4jgtuDfYGi3h2Rrw4EfsrynIwHud9+P1+SmlEeaIpB+Jx3ofP54Og3JCEPO/jHOMwd6bb7fb5fIWFhRAbCBIkCBSAcIqrdMGsKct3Of2UmnR9/z71zgLjwik3HLr928n7Hhv0qWvSu7OuRKRUoQpFQjieFziOKrKChAOqUCS8IHAEFf+p8uIaQ15WilHHc1FYImHB8qBycnIOHDigJvjAH1dSE7m/Ep8DkXI6ToOj5X0kBIcQ4vf7JUkKn0oYDZAgUkTKKb7tr0x8cAe94433RusASlZ9vae6Mtukp5Jf8kHHYbdfJ3ZARECeF9St7ygixwscAEDtd34/GAzklxcGzum+6+PbLLV67bTFI4Swea/FYnG73cEjNUH64jQ46tUYOU1ZV2M52v4UzQ+mvP1+vyiKcdAUiIiEF+ieZXO+29v/jRWjBfSLEp835PI8gMqDPtDxAEA4jgNKCCH8sa/nvPH15vLk3AG3//WWvLTSlZ/8T8zoWrry7R2ujmP+MaFfq4MfvvL2b9knDz82Sbjir2NHFsgKFfjTVBbqK9FsNrM86xjvV0PTQPNoJgrYsgjbODMWECTIEUR3xXZn/mWXpqECMq/TC4osK5QiR1AhghG2L3n1g8UHEF1fzZyweEPhnX+7uxt8M/O55TVg2PTRizNmfNX2qnEX6JfN/Nd/ivWpF/Xtme1L6jx8ZK8LMgCAC/UWila8wGoLy0bHsy607GyFZlM0P5iBp9frdTod2z4kHoUi+Hli5QkCUMCgQ9bZDNRoT29lS5eObV60vLjrzYWC3mDMJMUrvi0/2ceemTe0++2XXtwW8sb/MmjDHsE2omuXDGXbeX36n5cV6+wDAzvceDwei8USfstvDYkDTVM0P5imMBqNer3e6/XGWBoSJBQIb05tn1L9zRYP18MKoiyDXhAAgFCKQAgBShVEijJygmv7xk9Ltvh5Q9agcYPt3BEk5pz0tkgpelEQDBwi9XhlTvFUV8sZNj7ickmkm2UQRdFsNp92ORqaGJqmaH4wC5xte79///6uXbvGUhohhBAqg9B+1GXZXz348POd33iklx7g0Mqv92Z07pJtAklBAEDqkxRdij0d0nOvfPqeywhU7duwQ7Yn2yS3qKMUCAdAFUVBQjiURS8abXaBj49N4fF4ysrK7HY7ORtzW85KaHkfzc9hT4vD4bBarZWVlfV/2ygQJMBxBKjBOnDiKy/MfGzmn8YIyNG0zCF3TB5g8Eu8Uc8BCHqTQXQS80WPTP7zxBnXXv2avpWj8+gJd3HoJkaTjieEABBBbzbqFIDUfoPGLnzn7nHuWx6/58ZCWaaCcPoeTY7jRFGsqanJzMxkfhm1NZq9L84OjsqMI0fL+2h+Dtu4ISsrKzU1taSkJGTnRQ8kCEB4AORJUtYlT8zpU13tQwSDzWESAOjY55cCD9DxoQVDgQPkHT3+/Pr866rdis5os5p4AOVvL39SG7vbZvTz66/jOQCSefNz86+q9hC9lRBy2r4FdfA5nc6KiopBgwaxYxPV1mj2vjg9jsqMkdOUdTWWo+V9NL88jJ+WluZwOHbu3EkCm502VEh4ECCBqGlEioQz2h1GVU7CCToWdCfoAt8Bp7cl6wMfCC/oajUBIXwtGRGI3mrXQ2AwnIZgELCeAKCmpubgwYPjx49nI0q9WS3vQ8v70NAg2CjR6/WZmZmHDx+uqalhivz0jQtCap9o7g9RfaAG+al2bIAa+JoQ9crv3wOQ3zmxCIaBvI+SkhK3252fn4+Bzb5O8041NBW0vI/mz/sAAEEQeJ7v2bPnDz/8sGHDhmHDhrHs7DBFhQcBAiED8NTPQf+QOowQV/5AOu0HW31ZrVmzpqioqE2bNjzPm0wmtUAt7yNh8z5C2BRYD8GnDNT/qHFi57Bm79evnyAI33//PQmK8A/Tly0LGDAoXC7XqlWr+vTpk5GRobZD4vSFxgnJ0fI+EoLDcRylNC8vLy8vb9u2bTU1NTabDQNBSmeBcY5BB9ts2bKloqKiW7duPM+LoqjT6dQGSYS+OA2OejVGTlPW1ViO5qdICLCOQcTRo0fv2bNn5cqVJHCQ2lmgJhjYvXAcN2/evMLCwp49e0Jgs6/mFk1DZGiaIiGAAcv8sssuy8vLW7x4cU1NDTM0sOVPQDBwgiQhZMOGDVu2bBk+fHheXh470OQsuMFzAZqmSAiw9yql1Gq1jh8//vvvv//55595nseYt5lqdgTPOyRJev/9941G45gxYzBwAohmU7QIaJoiUcAeGEQcMWJEly5dnnrqqdLSUnWTe+Zbam4ZGw1VTbC9QhcsWLBs2bJbbrklLy9P9cI0t4waooKmKRIFqkZITk6eMGGC0+l89NFHT548qcbAkBaVIqGKyqLIBEH47rvvpk+f3qdPn9tvv129Wc2gaCngp0yZUuer+sORfSPLsiiKJpMp5HhlX1JKFUVhb8IzzZEkSZKk8PIoisI2fWgCDouVMBqNsZRDCPH7/QUFBVar9YMPPigpKenXr5/ZbGaLVSozMR8zDLXJHfNZrl+//uGHH3Y4HDNmzMjIyKgvvNo+iBixL+LCUWMl4lKXOlU8bY7f70fEaOQJX44sywAQO0eNuUAt7yMxOTzP+3y+cePG+f3+F1988d57750yZUpBQQHjICIL+01AE0OdQPE8r4aNeb3elStXTpkyxW63P//88wUFBWyH4ZC/TbS+iJKjMmPkNGVdjeWEGG0N5X2Ioujz+ex2e8S8hvAbN8XOYVNcn8/n9/sTSh62vV3s8jB7ymg0/ve//3322Wd1Ot1NN900YsSI3Nxch8MRS9J3k8Hr9VZVVW3fvp35Jnr37j1p0qSOHTuGjxBR3+FhSo6dg4HMd+ZCjpj3EbEuAAgfUBuew+Rhu4pGlCfGuholDwBYLBYmj7Y/RSKCDRSfz3fTTTd16NDh888/nzdv3oIFC/Lz81NSUtLS0lgKZrzqIoGctBihzj7cbvfx48dPnDixa9eu3NzcJ5988tJLL01JSXE6nXa7PdFMIQ3RoBEWrM/nc7vdqampYTgsX8NkMjUBx+v1er3elJSUMBzmOwhfTrw4Xq/X5/MlJyfHsS5KKXsJFxcXf/HFF/v37z906FBJSYnf72/otdNYRJOu0ljY7fb8/PycnJxevXoNHDgwLS0NAJxOp6IoDocjzA+Z78BoNDYBx+VyKYpit9tjrwvjkffhdDoppRHliVhOvPI+ampqAEDdAlo77yPROWxWn5+ff//990MgK4dluDPvaUPleDwev9+fnJzcEIfNcV5//fUXXnhhzZo19ZkY2G0gYl3qE4WBELJgJouwUhOrE7OdzyYOBMZJHDla3kdCcyDgoEZE5p5glwRBIISEd1gIgsAe0YYIagmSJPE83xAzyrpoqF3zVMlV90RitnOMHPVqjJymrKuxHM1PkdAgQauhqo4nhLApQ/h3AluRDcNh4dXMXxWSGZe6WEw6NDAiNbQUaJoi0VFf8cf9nQn13iHxrUvTEWcBWsB6mwYNGpodmqbQoEFDZGiaQoMGDZGhnfdx7nKCL4VkJqDMGicajsqMI6cReR8s1Ud1XDXEkWW5aTjq7gaxc8JslJCwHAxadDy9chjYUFA797TrgiC3aCz3FU058eLE676iKacp64qmnMZyQmgKFptVH7Isy7Lc0NVgiKIYUoIoORhYaQtfDovjDCNPNOWonDBRj9FwIIr2iVddKsfn84WRh8V6hpFHkiSHw8GGQk1NDYu/qFNgNHVFL4+iKNG0T4x1RSkPi3eMlzxerzcWTqPkibGuKOVhcZyq0aGtkrYMEMKxk34CxiLhOKAKcLzAEdadrNMRkLAYfUoRgPA8USjwHMcuUyorCmirlhoaixCaQo30rgNRFJ1OZ0NXGSilfr8/fF5DvDg+n8/j8YSXJ8ocE7avRIwcn8/n8/kiynO6dVFFITxf+4hLkt/vV5LsZp+rRqKcYNRziiSKyAFPdLIsEr3J6Pe5XE6v2ZJnsRBJ9oteiYJgtiWp+YMYFCCclJRksVgakkdRlIjnoUQ8F8Pj8UiSFL59oiknXhy3260oSlzkQcSI57xE5LhcLkppRHkilsPOZIud43Q6AcBms7GPjcj7UAP1MGysXpNxgk8liJETPpaxeTlIkXDkxLsT734n/7lVdxf4FDDye9c/8e9p2f9ceP3qJ/61vFz0HD3us6ekC8lZkCt0235oG6k5eRisBVb9iW6DnxubuuDmf/+Y0yGHSMdk/dWvzrwj1UYoAFUUFqkd3ODBUjX7vbcUTlOOw2jKgUg5HafB0fI+Ep2DgIQQVCS/X1IopZQCJYosi5KH+lrf9tL826Bq0Zh/brt64uQ/5QeKOfLm3+/GQfP+doMIoD/2+n+ShetfeOdvraF45rg7p77S44VHL+JlBQK1QJDjqo5Uid8+icBRr8bIacq6GsvR4ikSHezUQEAi8EYrz/MWPc/zVouBBwIEqaIoissPVBHdsqIofr8sK4riEimIfqfXXaNQRI4nnOIDAGjXd2D20eKdbgCehlof06ChAWgezYQHQQAiJAvlnoUPjV9vpAi84Dzxq5LyZ14mHM8D8BwhhON5nieIyPOE8BwhyPE8z/McIRwo1O08derUsaXzv6oadPM1SYgKxxGIw+41Gs4RaJqiZUCpUdJNIyb++6/t/BQM/O61T7w200OjO+GYd3AVnuXTJ+zgfM4+Y96852Y7IiJPiHKGhdj+eP4AACAASURBVNZwFkHTFAkPJACAFHhidjgcDglAB44kI0cRCXM+1fsF/uEf+aSSbbthxrw7sgNfAyEEqTb70BA9ND9FogMBAQCQUkWWEZH9URSKyB55AETmNQfmqgZC2BeBuAmCsuxzKYriFSWKtQomhIbRoKFBaHkfLYCDiETQ6Y2C+mwTTqfX6wI7mBFer9cJJNBztXSs3SsLCa8zGHU823eKRWfV0jC46vpSJcK9a5zT4KjMOHK08z4SnUN4AgDpf3r+o1uIQAiYBABo32vyvz9RrDZWSPbod2cjx3MEQKcjAAAFd8782OMVPT5iMJGM26Z/9GdOIAQMv29HT4I2SoSgBJmEuveWwlGZMXKasq7GckJoiobO+2Dxamxv1ZAVQOA8i/olxJeDiBzHsTyCc0UewnEERX/tK4BS4AUi+v2oXpQV+XcbBHiepzQgDwLPUfW3ai2yLKtxmV6v12w2s3036wgfjcwscCt8+7BYz/DtE76ceHFUeSKO5yjrglBPTfQcVR5EjChPjHVFLw/jqPJoHs0WAqR/9EBSSlHd4LbuRUCkyu+KASmldY0Fk8lEKeU4TqfTUUrNZrNer9fr9ZRSSZLO1F1oaLEIoSkainJnCi98rDjLswgfJx8vjqIosixHjLeXZTli3H5cONEcnBFHeSLmYsiKQimtIw8zD6urqxcuXFhVVWU0Gjdu3JiUlPTOO+9YLBav19utW7f+/fs3ti71jM/wMmMUOQsRy4kjJ2J/RVkOxuO8D7/fX7+/Tq8ciMd5Hz6fD4JyQ7TzPs45jiRJNptt9+7dH3/8sdVqBQCbzTZ//nxCiCzLb731FiKyQ0YSR2aN0ygORMrpOA2OlvdxznHYjjKDBg1avny5KIpMI+h0OmZQnHfeeYQQ1VuRIDInOEe9GiOnKetqLEeLpzi3gIhs36RevXqlpqYyrxUAsBOYu3fvnpyczPazQS0vREMQNE1xboG9KxDRYrH06NEDgha20tLSunXrxhSE+krRoIFB0xTnHNRZ6LBhw9gCGCHE5/O1adOmS5cuqtHR3GJqSCxomuKcg2osdOvWLTMzU52AdO7cOTk5WVGU+iEVGjRomuJcBDMrTCbTgAEDfD4fIiYlJfXv318zKDQ0BC3v4xzlsHXQgQMHfvDBB5RSh8PRt29fDKyZqSUklMwaJ0qOyowjR8v7OBc5JLC00a5du/bt2x86dKhv3771Y34SSuZE5qjMGDlNWVdjOVreRwuTB4N2JPb7/dhw5AyTpyEO2081MzPzggsu2LJly+DBgxk/mBl9XRE5Wt5HGA5qeR8a4gX2BAa/c1jWRkNkLgCe50OOPPZ46/X6Ll26FBYWdu7cWQ3KrF9gmLrUGlmlwd9Aw/athhYHLe8j0fM+6j+liMiSuARBCPOeZ7/ieT7kWgYiCoJAKS0sLLz11luNRiMhhG3qX6ecaOpiu8urnDo0pqrYO1PL+2gIWt6Hxjl9DiKyV31xcfHixYsPHDhw6NChkpKS8Ocengaef/75eBWFiA6HIz8/Pycn5+KLLx40aFBaWhoAyLIMUeQaJGxftCAOaHkf5wJH/Z+pic2bNy9atGjhwoVWq5U9fl27dhWERJw2YiC+0+12Hz9+fOfOnYsWLcrNzb311lsvv/zy1NTU6upqlVz/9hOwL6LkqFdj5DRlXY3lJOKAO5eh6nhCCM/zCxcunDp1Ks/z48ePHzFiRG5ursPhCO8ySBB4vd6qqqrt27cvWLBg8uTJK1asmDRpUocOHSAoojzkGNWQmNA0RWKBBKVmzZkz58UXX+zRo8eTTz5ZUFDAvkREttEDSbwkLvbkM1PIZDKZTKbs7Oz+/fuvXLly8uTJ99133wsvvNCjRw9Jkuo4RDQkPjRNkUBgTz6l1Gg0vv/++9OnTx8+fPi0adMcDgdzGbK3MXvMEvCdrM4+EFE91dJkMo0cOTItLe2BBx545JFH3nzzzfz8fHY10eTXEAYtwI49R6CaCUaj8fvvv3/ppZd69+791FNPORwOFubA83zEqWzzIlg2QghbpmXhIb17937mmWdOnDjx5JNPer1e1fpobpE1RAtNUyQKVDOhqqpq5syZSUlJ06ZNS01NpZTyPA9BLowWAVVU5lWRZXnw4METJ05cu3bt3Llz1ZvVlEVLgZb3kSgc1XRftmzZ1q1b586dm5ubK8tymICoxAfTBUxZSJI0ZsyYdevW/fe//7366qtzc3NZnIXaMpAwfdHSOSozjhwt7yNROOwbt9s9b968QYMG9ezZU42tbqFqgkFVFpRSQRDGjRv3448/Lliw4MEHHwwOKkuovmgsR2XGyGnKuhrL0fI+EkUeRBQEYcmSJSUlJXfddVdSUtJZs0bAlAUzjnr16nXhhRcuX7581KhRbdu29Xq9wYu+Wt5HwuZ9aH6KRAF7lhYuXFhYWDh06FD2kZxFM3kSWBMZP3783r17f/75ZwgkqmlIfGh5HwmR98GsttLS0rKyssGDByclJbV0D0UdkIALkxBy4YUXZmRk/Pbbb6NHj1YPMWPQ8j60vA+NE47D9pVZs2aNJEmDBg1SHyo4i0AIYRaE1WodMmTI2rVrjx07lp2dzfbjS5y+OAs4oOV9nJUctTM2b94MAL169QIA9eGpX07LBSGELfoOGDDgnXfeKS8vz8rKUi8lQl+cHke9GiOnKetqLEfzUzQ/EFEQBFEUjx49mpubm5SU1JCyb+kggbdiXl6exWI5cOAAG5F4tvhizmJomqL5wZTC0aNHKysri4qK8MxMPRAwYE8qsiSzM48R2WdZkphrqPZ7qiiyzE5FjudTrKq/pKSktm3b7tq1Cxpeq9OQUNDyPpof7DV79OjRkydP5ubmnqF3LEECBACQEF7QAQAgADMteUHgfydSBMLxfOAdEs+nWDVlbTZbRkbGvn37JEnS6XSaTZH40DRF84O9aU+dOuVyuVJSUs5ULQSBAhDid+5Zv6K49SWXnJesU5DweGLLj+u2HTgugsxh+2E3DmltwoodP+48kXnxoPYmoIhcfJUFIur1+qSkpAMHDsiyzHbKqhUyCCFuIVFjIhONozIbywnzltJmH80P9qb1+/2iKKrZ5XEHIlIEQuSS3957cNwDC5YeUQggAtA9H06dtmhNDQDsXDnzX5M/AkKKl82e8dK31QAAtZOQeIEQQik1m83Z2dnV1dVs6sFyyQghPM+zKBL2sQ40zhnlqB0UsuO0vI/m57CMcp/PJ4qiyWSq/9u4gCABnlDx6JZf4Mq7Lz+y8r2yKx/PsQOA3pbU9tIb7/nLpXq4Lv3Orgs/f/jKwozMtFQrDxD3UHL19vV6vcfjCZ59EEJY3GRDgSTsyzhyWAhM7OVg4ESlGDmU0ojyRFMONLx2FpJTu/t2wLjDUHZHI/I+6mQ9N8RhJ2U3Aae+OjxtjkprFg5rWOZRtNls9X8bOxAQADig1fuXLPsy6dE3r55z7dNL9nnu6m4BUBRJpuzIwRqXgkYeCCqyIp+R6Ek2LgVBMJvNfr9/8ODBwXuCqioj3L3EiQNBHtYzXVfCyqN2R0FBwZw5c5KTkyForKocCKkpampqQpYuy7Isyw1dDYYoihEbJQxHba/w5bBHK4w80ZSjcsLsYRsNB6Jon4bKkWXZYrH4/X6mHxv6+WkDAQkSJBQpd+C79SmXPtiu7fl/eiTz7Q/X1fQYaqMcZ3KvX/KW4QhuXf1t9p0PXp1h+cUj45lZjsBAVA/LfxsyZIj6TkNEluciSVKYvogLBwLPQ0gDML51JbI8iGg0Gvft27d79+5t27Z1795dzUtkcZyqPJpHM1FgMBj0en00irixCKgJwnEly1b/ts3zyiPHk5yl+7ceWLjpxLBByYBACE8BhN43PHHdyAsRReWMBXOoJp7H4zGZTM8++2xz7R6MiOreH4mAZpTno48+euGFF8J3RIhrSUlJIamiKDqdzoauMrBEyfCT7XhxfD6fx+MJLw+zO8KXw2wBo9EYI8fn8/l8vojy1C+HJV87HA5BEM6EpkACqCiE0x1d++6OmmH3TL0uQ6KcbvDi52f/tOLU4Jt56rX1u+be24cAACiyAgLHCxzPnxFVodoUbrfbarX6fD6TycReXBzH+Xw+5u8MmU/Jpuhx4RBCnE6noigOh6Oh+Xz0dSGiyWSKhUMIqampoZRGlCdiXV6vFwCi5IiiKAgCO9LFarVarVaV6XQ6AUCdDjci74P5Whgautum5DBHYFw4Kq1ZOMzeMxqNRqNxz549ffv2hbgCUUEUOKj48t1vTD2mXdX9otrvL3rjwefn3DzyCjx1rKysXJbTEAE4HQ+S6K6uqvLSWsEB4qo0OI6rqak5fPhwSkoKO7hInTarvrCGTjOKLwcief6iLIf9EzuHEcLLE005rDGj5LB6IZBir/aFuhMqankfCcJh/6SlpdntdrfbHWamenogQJAniM6MTjeMGdxN3by3yw1/vUGpVk6m9xs3WuloEwQdImVv96xul11lLzQDAMQzmAKD1ji8Xm9ubq5erw9uh2bvi9PjqFdj5DRlXSErrdMXweVoformB+uV7Ozs1NTUnTt3QtSu8qjL53hAIAXX3HcPAGBtFA2a8q669xEAgDZ33qsyCQEAvu3gW28fzL4TuPhpChKw8qqqqkpKSgYMGMBekiHfohoSClrkVfODEKIoSnJycmpq6p49e4LVfFzAnkRAKkuSoiAJzCiQyizRQ5EkRVEXzwEAqSJLsnIm8j5YcdXV1aWlpR06dNDUREuBpimaH+xNy3Fcu3btqqqqiouLoeFo3NMrnxAAwgk6HfNT1pqUnKDTCRxH+KDva6/wgk5gLs04P8VslX7btm0WiyU3Nxfiq4o0nDFomqL5QQLnkvfp04fn+dWrV0PgfPCz6Sliuo9tOPrtt9/27NkzOzs77gaUhjMETVM0P9RlkYsvvthoNK5bt449PGelWY6IJ06cWLt2be/eve12O4vEPZsU4tkKLe8jIThMU1gslosuuuinn37as2dPYWEh20oT4j4BaA6oWo8QsnTpUrPZfOGFFwa3Q+L0xVnAUZlRcuoUXr9G0M77SBwOUwpjx4798ssvv/766/z8fIzrCkjzggTW530+34cfftitW7eePXuSwBmrkGB90ViOyoyR05R1QdC0l32sk5FUpxztvI9EkYc1cufOnYcMGbJo0aIxY8ZkZWXRwNk5LVdfqO8oRVF0Ot2CBQsqKiruuusug8HgdrvrRBBr53008XkfbH8Qlm3EPqppptp5HwkK9a07bty4srKyDz/8kKlzDNoouSWC3YWiKIIgHD58+OOPPy4oKBg+fDhLYWxu6TREC+28j4Q470MFIvbq1ev6669//fXXO3XqdMUVV6gbFmALdHAyBccSn3w+37///e/9+/fPnTuX7Spc/3a08z6a+LwPNudlKttgMAiCoKpv7byPhOYAACHk//7v/w4ePPjYY48lJSX1799fkiQWn9+ClIUqKrMmKKWzZs369NNPJ02a1K9fv/prwAnYFy2XA0H5GuE5anIHBHZUUgdhnXK0vI8E4mAgXzArK+uxxx677777Hn744WnTpg0ZMgQAZFkOPsIz8cFGniAIPp9v5syZb7755s0333zrrbeyjLj6t59QfdEojno1Rk5T1hWSrPLrX2pJI++sBwmc9Ov1ejt37vzyyy+npaXdf//9r732Wnl5uSAIIXdGTFgwO2jDhg0PPfTQ3Llzb7rppokTJ5rNZghkcDZ3e2toBDSXUmKBEIKBk6Y7der02muvTZky5dVXX/3ss8+GDh3avXv33NzcNm3aGI3GaGYi0XDY3o1xOVRdNVwrKysPHjx48ODBVatW/fzzz5IkPfzww2PHjmVWxll5PNpZD01TJBxIwLKQZTk3N3fu3Llr1qyZP3/+V1999fnnn7MtvINnm2HKIYH1lDAVmUwms9lcVVXVEJM90hHrCubwPM+28DKbzVdfffVf/vKX7Oxst9vNtmxTl341tCBomiIRQQKRMEwjDBgwYMCAAZs3by4vLy8vLz927BjzXYffSY3tPR3GB86e2B07dmzdunXUqFENMZkhEL6uYA4iWq3W1q1bp6enFxUVsZNHmWOspceGnMvQNEXiQn1RM3Tr1q1bt25xr+Xtt99evXr1tGnT4l4yQ7D/UvNNtFxoeR8JzSFBTmkWWMHmCCxe1mAwYMMrYV6v1+/3h9mXkbknXC4Xz/MVFRX1mRgUmxu+LnWdn31UVQM7tSD4ZhOznc8yDkTRzsGcOoXXrxG0vI8WxAm2/wkhEaOGWLRyGI6iKGwbSwDQ6/UNMaOpCwDC1JU4bXiGOCozRk5T1gVa3ocmT5TysHNG2CU15r8+Mxp5osyziNg+Wt6HlvehQYOGFgwt7yOx8j6i54Rf14AoZh8swp/NQuvE/De2rmjyI9iJVXHJs9DyPsKXA1reh8aJI4clbrFLNNRJJQkos8aJhgNa3ofGiZETPFCgYQ85CaSuJoLMic9Rr8bIacq6QpJVfv1LWjzFuQUSlL2uDk1VKUBQEAdpyZtiaIg7NI/muQUM7O7bUOx28HYYTSybhkSGZlOcW2DTjZqamnnz5pWWllqt1h07diQnJ0+dOtVsNrtcriuuuGL48OGamtBQB5qmOLfA4iwcDocoikuWLDGZTBzHmUymVatWISLP83/9618hsEuVpi80qNBmH+cWMJD0PWTIkIyMDLYqhogmk0lRlN69e7dr1051XjS3sBoSCFrexznHYZqia9euGRkZ+/fv1+l0zIspSVK3bt0sFoskScGhFokgs8ZpFEdlRsmpU3j9GkHL+zg3OYQQjuP69u27f/9+9o3f78/Ozma5qmqQRULJnMgclRkjpynrgsAwUD9qeR+aPHXlQUSe5wcOHPjuu++yoeD3+3NycoqKirxeb51BpuV9aHkfRMv7OJfRoUOH/Px8NjIEQejatavZbA4zTDWcy9DyPs7pvI9Bgwa98cYbgiDYbLZLLrkEEc1mcx1NoeV9aHkfoOV9nJsc9iVzVcyZM0dRlIyMDOakwD/uOpM4Mmuc6Dmg5X1onLhwCCFs07rc3NxOnTrt2LFj4MCBJNReuIkjcyJz1KsxcpqyrpBklV//khZ51fxQ1TzzEdAAwrwT4sKRZTktLe38889fu3YtOyhUfcnEva6GOGxEoha7kfDQNEXzQ1XbbNJoMBjCTzIh0iyUwWKxqJvf1Yf6/UUXXbR3795OnTo1xIymLqPRGI08oiiGrEVTFokPTVM0P9g71ufzHTlyhEiSoiiKLBsaOPuHfanu0B+G4/P5RFFs6Kzg2ukogKAoA3r12vvbb/p6pUVfV5Q7AMuybLPZaotFtNjtWZmZmppoEdA0RfNDlmWdTvfNN988MGHCKaMRCWGupAg/IyQChxASyj9dBzzP8zz/6FtvhSstiroAIskcLA8hep/vgrZtF3z6qao7wsupoXmhaYrmB3t4jldUeCh9xeUye70I0GTPjerrbqoKQSGER/wuOXnRiROK3w82m6YmEh9a3kdCcBBR4HmFkGvLy/Vho+vOGlQQ8rHdzv8xQyER+uIs4MAfWzU8R2XWKblOOY3I+2DpAMFLKSE5bCf4JuAEH/wdI6dOxHsTc9SGRcRKnS5NFJvSpmh6SIToEL08TyjlAvfOLqlpCOHbMF4cDNrs60yX05R1RVMOBJzoJJD9wYftixCaoqampv6XAMBiwhu6GgxRFENKGSUHA7PW8OWwOM4w8kRTjsrx+/2xcCCK9mmoHFmWrVar1+vlOI6nVEA8uzUFAgiIbBhWV1ejTseCO9T28fl8EfsiRg4E4h2j6a9o6mL5MqfNaZQ8MdYVzFEUxWw2e71eAHC5XC6Xi/UFBOI4VRPjdPwUYaya+tLU55Cg8K+GOBBk/ITkEELUkLIw5WBQRFpE5aXhHEfwGI5yHAb/HwsnyvFcv5wmG9UhNEVSUlJIqiiKTqfTlkj+J6/XazKZwnPUuMOQHQABWyB8REA0HJ/P5/P5Gmq9MOWwU/9MJtO5lp2FAHa73WK1qt+oq61hfhUvjtvtVhQlfH81JRRFoZTqdLoYyxFFEYLyNcJz1LEHAFar1RrUF06nEwBsNhv72Ii8DzX/VFEUt9vNHgyWiagimiypeHH8fr/f7w/f0yzlxm63m0wmVpq6TQsE6fKQp100GUdRFI7jWNuGtNfOVpBAWrdq9DVxXyBi8EhzuVx+v9/r9bIHCaLIsmMcRAz/hEfD8Xg8iGixWCKWo9frDQaDyWQyGo3sIZckiYXtsfuCKOwX9r869iBUXwSXE8GjqVrviGi1Wv1+/4YNG5YsWbJz586ysrLS0lK3292Mr8HwjxYiGo3GnJyc1q1bFxQUjBw5snfv3gaDgbWOOjFWAc2URxDxh2cx1BuHM9/OKtSHgb1ReZ7fsWPHypUrN2zYcPTo0UOHDlVWVjZ9R7AaI74qEJHn+aysrNzc3Ozs7BEjRgwYMCAjIwMAVJs0mvaBUA1Vpy/UEkJrimCZgh+nH3/8cf78+evWrTMajb179+7Zs2ebNm2sVmsCegFUkbxeb0lJyZEjR3766afFixf369fvhhtuuPzyyzGQZHFOvcM1QNAkVFEUi8VSUlLyzjvvLF26tLKysm/fvgMHDszLy0tLS0vAUQ1BEbFlZWVHjhzZvn37Qw89dMEFF1xzzTVjx441GAxnblQ3qCmCrQmO47744oupU6fyPH/nnXeOGjUqIyMjvEmWUJBluaqqaunSpW+//fZDDz1UVlZ2++23k0DqpKYszh0E295Wq3Xjxo3Tp0/fuXPnqFGjxo0b165dO5PJlGjaoSEoiuJ0On/55Ze5c+c+/fTTu3btevzxx2022xka1aE1haomZFnmOO6DDz549tlni4qKnnvuufz8fJXDZnrxFSju4HleEIT09PQ//elPl19++eTJk59//vnq6uq///3vbFvqljIyNMQOEsjZFQRhw4YNDz74ICHkP//5zyWXXKJy2HS9GYWMBhzH8TzvcDiGDh06ePDgV1999ZVXXjl16tSMGTNYJh5TiHEc26E1hdqgOp1u6dKlTz31VO/evWfMmJGens70MQmKa0pAOw3rLceyf9LS0mbMmDFlypSXX37Z4XCMHz8+ePcODWc31MEgCEJxcfHEiRMFQZg9e3bXrl2D/X8JO6rhj6v+GADP8//4xz/sdvu0adOeeOKJZ555hp3VQoJCVGJHgzYFk2Dfvn1Tpkzp3Lnzs88+y9SE6uFQhUi01oQ/OguD5aSUmkymxx57rLq6+sUXX+zQoUO/fv1YMGizyquhKaAOBo/H8/jjj7vd7pkzZ3bt2pV5uOsspSfmkAiWjYnKVi4Q8U9/+lN1dfXLL7/cpk2bCRMmqH6DeFUdoqBg/TpjxgxEfOKJJ7Kzs9Xw6kRuyvqoo9oURbHZbI899lhOTs706dOdTiebgzQvQH3jNXNrNTWauJ1ZAOL8+fM3bdo0YcKE/v37S5KUyEZEGLAnERHV/IB77rnniiuuYHcHQbvdhQeESgOpj9DbirC/P/zww+rVq8ePH9+1a1e2B0mLXixgrclxnCiKOTk5DzzwwI4dO5YuXaqGuwcniaio8+WZ4KgB9ojYYsZpPIABUz84HebMtTMiCoJw5MiRzz77rFevXmPHjmWrpCSuVnoTQxWeOV/++c9/EkI+/fRTABAEIZr2gT86ExrqiwbP+1AUZd68ednZ2VdddRWllO2e1HIblIHJz/O8oii9evXq1avX22+/PXz4cL1e34znfUiSZLVamcnWUtXwaYEA+P1+gySpuQZn9LwP9ix9+eWXJSUlU6ZMAQD2GLT0UU0Cr3ZFUdLT08eNGzdnzpwbb7yxqKiIWUz1fxKf8z7YtG3jxo1bt2699NJLW7dujYHDLFt0g0JAAbN7cTgcI0eOLC8v/9///qfX64P3j9Rw9oG97Y4ePbpkyZIePXr07dsX/ujGatHAgP+S5/krr7zSZrN98skn6lCPSxUhbAq9Xi8Iwk8//eT1em+66SamUc6C1mRQDS1EvOKKK956661Vq1bdcsst6hF7IXFGz/tQz1w4B2cfBoNBp9OpYc5n7rwPNtE4fPjw5s2b33rrLTb3PmsGNrsLZiy3b99+0KBBy5cvnzJlSkOtdBrnfYSwKXier6mp2bp1a1FRUV5eXkt3T9QH07WU0qSkpAsvvPDgwYPFxcUQFPcejDpuoZBeohg5aoD9OTj7UDcEP6PtTAObnv/www+ZmZlFRUUQRdx0ywIGzuwQBKFbt25+v3/dunURG43WO++job4I7dHcv3//b7/9dumll6rss0P1Mqg2JyIOHTr0xIkTW7ZsgUDYfLMA1NlmM7dNU6PJWpjjOI/Hs3Llyj59+rRq1UqturkbIG5QbxMALr744tTU1BUrVkDgDRQGEOTpCNeA9atExOLi4mPHjvXr1w+CVpjPMrCb6tu3ryiKe/bsIVHk5zClGZEWzD+NX2kIRvjWi6aF1UuVlZU7d+7s0aOH0Wis9R+fXT2CiMwTmZ+fn56evmXLFvaQx+U2Q9sUBw8ezM7OTk1NJWeLy6cO1PtKSkrKy8s7cuQIcwLXaVP1IyKy7QPUn0dZi/q3RcQIJxSCLWFoOC0SAjF1zFcPoTZVYpy9e/daLJacnBz1m7NsYKt6gRDSrl07t9tdUVERL6dmCE3h9/v37dtXWFhoMpkwKHo0PFStrsiiKIqiKMlKQr9I1TYtKio6fPhwVVVV8J2q/1BKJUmCwEE70ZgeKhiNLQEKgqCupJ5RE0MtVAEQCREJkQjQP15KcGBg2wiW3aBGT4ZkAoAsyyx5nFLKdnAI5qjqYNeuXRkZGVlZWRBwaYeXAQAQqSyJoihJ0h9Gc+1oB1RkSYlmnAc9HrJM/1CUeo3KsqzEODTU93rHjh39fj9zwMVlXS+EpnC5XIcOHUpPTzcYDMGTmYjyEUQFCS/o9Xq9Xq8TeILIiQIKXAAAIABJREFUHsjY5fxDXewvVRRKY2pXNq/LyMgoLy+vrKwM9uJAwMHD8zzzzG/duvWDDz44depU9DUy2smTJz/66CO2lmQ2m81mM3sSICgqLpa7+EONAAQAASgAD6BH1CPqELigSwmlL4KnDwysZZgT3u12r1+/fsGCBdBA+7BnYM2aNf/73/8OHjzIOotZ4HXccgCwd+9es9lstVqDbb0QIgH+/oIknKDT6/U6nY4n9PfRHHgkCC/oeD6KkGXVIcALgsAF/4Co1zhBEPgY45/VW0tLS/N6vaWlpfF6IYVYJRVF8cSJE3379lU3wwkvOAJrVgqE44l7xTtTv9hCDTqhz+UPjL4kTVGQI0jZCOUIIQQCPafeWuAj4TiCSBGJehANU1PsOy6QBV9L5nkApIgcYb9S+cw0iNzcrKisrKyamhq3260WHjySduzYsWHDhk2bNu3Zs2fnzp19+/a12+11lDQ2cO4mo8myPH/+/Kqqqm7duhUVFXXv3r1fv37B8TAYdBpo7P3Kfs8BrDJkLW5jMShgoK6/Fx/NhFrLggRoTHcEq4/gj0w+Wo8TTIvddkfVtc5xhBC2m5OiKBs3btywYcO2bdu2bt1qNptHjx6t+puD25l9WVxc/OKLL5533nmdO3fu1q1bv379srKy1F5g3UopraiosNlsDocj/ISaAAECVFE4nsdTu+b8Z8aWo2ltC6648x8DbZRSjkBtF3OEU9YsnO3L+8uwnkmKgrzAcbU1/j4aawc4RYpACB77/uNllReMHd1ZkBQq8DwhiJTKwAncsd2frV7nGH7zJclGmSoca9zfx39AutrHoOEbYFeysrIURaljKceCEJpCURSXy5WZmSkIArMAwxdBkCBQAI4qv82+44n9rS674YYL9d6an75/6+eOk7qlK4QXAndV+2AH3yZTIOx/isARrvY5rf2KAgl894e55a7/PPJa25tmX94NZFHi9TpO/QEyeuSRzAZoTk6Ox+PhAmAtcODAge+++27dunWHDh06ceKEKIoWiyU5Odlms6m0OrBYLHUusf/NZrPD4Thy5MiaNWtWr16dnp6elZXVs2fP4cOHFxUVCYLAFr31en3sLiECQAE4gHdatVluku84VmFG+E1H7m2bPfVgWYegFiGB/xlf/R6DLkGQzYlB/9M4KQtENJvNaouJorh58+ZVq1Zt2bKlrKzs5MmTzOjLzc0NbtjgXUhZOIDVarVYLMXFxbt27Vq2bFlGRkZ+fv7AgQOHDRvmcDjUH7pcrlatWjFFH6adERAQCUfQVfzSlEelgltvujGzeu/65V93GH1ZuuRHgyHQEihv+e7D6otvvvRiB6sEAYAqhOMDxSMiICLhOB4AAJybly0ptt40+nydTmDfIOF4HQDAyUPfr1qS22f0JQ69DLwxUIeCwKvjnxUZ/iXILrZu3RoAPB4PBHl8IciIC/6+jmVXh8n+CaEpKKUej4c5KaLRRkiQKsjz/sVPP/Czb9ysZ29NAwCA3oP7i5TwglB1cPvuY07w2Ar6dU7XI/XUVHg8vN9zuOSwPr175/am4u3rD7sc7c/rkJUi+KqPVnptdlK8pbjGYmlX1CWLR7H6wBF3UmZOuglFV+nhCkd2SuX2tet/+uVw+qp2yd0L2jqI59BP28opJBX2LErmgi2DsJIjAoDJZJJlubi42G63e73eX375ZeXKlbt37/b5fCxcx2AwsCmD3+/fu3ev0+mkgV181XJIqHNAGe3EiRNer5dpBESsqak5efLkrl27Pvroo9zc3KFDh/br189utx89erS+S7WxYM/wPqL70uR98VBFWwQA6AWgEOXVnJRZhysPG/VWn5gMIAIc0QtZomwE8AqGbRYjyP4ubp8J4ATR+QSaIykAUK436ER/CgAHsNNiqdTxbd3u1pIC8bApCCG7du+2JidXVVWtXr169erVpaWlbLNcnU7Hpgl+v9/n8xUXF6s2RfAZqGrkJaXUaDSazWZFUcrKyg4fPrxu3brZs2f36NFjxIgRnTp1AoDq6urc3Fz2K2bChJQKAYECx3Plhz7fsrFo2sxrcgGgb0/JDwicwQAVezbtPerPzL8gP8dgcbTmjN4Dv60u86V36Ngh3UKA46mnZOu2Ei+mdera0WFEJBx4Dv+8pQT4FLRlpCSZOBAr9h2k9vzMdIGIlYd2u+yd8/TGpCSHGQAJZ1RO7t2w+wRvSu/crb0FpcojxyGJL991mE9td15BCs/etw20Kht+bANntj1/8M0G28skVN5HfSb7J4Sm8Hq9fr/fbDZH7ctUgAgort20ynHZtFvTACWZ8hwBMOkFpWTzW888sMp6cQ79rbz69QH3z72nk3PbcxP+Xu0Y09ZYvGnXS92GXmaq+u1A6b7j8mWzX72f3/za7TP2DTw/9xj1lf5U0nPCC/8cZfzstr+tueqZeRN70qMbHr37qeunvW78cVO5H9zrFv9Q0KajYf8rUyYvw/aFpw74M+9+ZPblOUiRmZERJEcA0Ov1Nptt4sSJlZWVPM+bzWa73W4wGNToNERkwfBms3nUqFF1NhlWwdpd9cCrEAQhMzPTYDCwlTlBENSQxIMHD7700ktPPfWUoijJdntaZqZUXByxwcOAAggAG1plX1Ra1hZBCXwzSOG/4UxHAZ5s3+aS3/aOBSgFuCM/fd6u8iST9Ym8VA5NNbw///jxB0+4Pte3Xt2q5t2SSgB4vl27trt33Q/w3xTrpymtMnTE46p88FhNF1GuY4ycBgSev2zECD8iz/M2my0pKUmn0zELS50y6PX68vLyiy66SP1Vfaey3W5PTU1VfRxqYKIoit98882nn37KNHVSUtLFF18MgcjuhqQiQIAgBbBldsi2Tn/uhY2vPnwxAE90lJDKjctmzXz+YFqhXWhVMun+a0x8zaqv3vZsO7pl4zYx9YH//PdGW8XmWZMe3Jp8nvWwj+s49JlJtyZ5vn/p8Vc3VWe1y/Uc2nrS0tWogyNz7h2rDF3y+EMZpPTzfw5ccXX5h30FkGUq6IhS/Pnkx+budeTnlxZ/0nXqY0+1WfHChM9Kk1u1z+zSY3R+fjJPKXJ8+NmHxWJBRGZT+Hy+Opv9nkbeRwhNwXGcTqfz+/1RGsMECXBI3JW+8oKUXgpFjuc5QAUVIletf/WxxW3vnTvpumyAk6/dcP3ChWMm35imVCoX3vB/919n//GRvhOWub/+5pVUuvS+K1/edOD+4XYD7/S3ufX5f3aBmjWP3fS3t8dc839JKQ6ziUcA4PRWu1lQOo247+8//vjQ+RNm3dDHu+TR/9tomfDlS5cCrHuo6OXv91w6rpCnlEIk4dndybLsdrsnTJhQUFDg8/m2b9++du3a0tJS9kirCXasxadPn56SklKnZTCwd7kkSayH1NFMCKmurn7//fePHTvGeovNsWVZ9vv9KSkpQ4cO7dGjh9Vq/XHNmg+/+koQBJCkiG3eEJAAIlTbZOspjipAANgDwSGkKJQCWBWFPUYcgI2iGWBeqsVUfXz6UQ+AaXyafb/OlaYoZqTsQTRRmgKw35H8iVn3xr79rQBey3UstpsuOO7kYjYrFEpnzZ5ttNmqq6t//vnnn376qbKykiUTkEAKoyRJaWlpU6dOVQ1FdZ9rpk04jlu7du3y5cvVYGK2YsqWmYqKigYMGFBQUEAIefrpp1mEcvgkplo/BVJz6hWTZh276/5Hbvm1+7V/ffiGSzLde76YOWv/n196b0RXcqL8kAFkj6tKSSq6f+rTumNz/zLkhz1Vl9W8/PR28wPvvTgS4JeHr31+9f7rWv86d5My5r0PxhA4ufCOv34tUwDelGRXTAQAkDNYk20GwiYpOh5PLXzp386u//nk4SLwfXJbp7d2Pv7vpFZO2Hv99OljDABIEQQ+jEdAtXAJIbGfCaAihKYwm80Wi8Xj8USz6gEAQAAVwKRse95R1zae6079oswh6gwCPVl83HHh+MHZXo8HhNQLrsj+ZOs2/2UOU5vOXTskSaLbQrqcl9uBQ1E8ZbPb0ekFqqMpna66sYvk8chJF/TvxH1/RPbzMiChiiQDCBxRECRFqvTJcuXRk37Ru+e4eOrku7fd8rYXqNSedt0JeF5UY5jdHds9fejQoeeffz4AXHvttRUVFdu3b//uu+82btxYWVnJtCwzd0eNGqWegFAfdWYlDB6P56uvviorK2MvPZ1OZzKZunfvPmzYsK5du6alpZnNZgDwut1vL1gQ49YjBIEAZFaSXxXkACRCKIIe0EsUt4BWAAWAAJEI8ggEwANQpdDfWp03NkUiyJeiS3ERRSIAwHZuZbrmqNnkS0qd1CnNR4jXyHXfd0COx+HXlNLrx4wBQQCAUaNGVVRUbNiw4dtvv92+fbvH4/H7/cynbrPZRo4cGaYcZjuw9yF7z7Vu3Zr5KXJyctLT0xnt9ddfZ89P5IFNCI8AAI5O49/74P/b++7wOIrz/3dmd6/rTr132bJw71jG2OCGMcaFZtNCD4QQkpAAhlAcvhAHQhxIIDY1/AglQEwHU2JTjLFxtzHGvchWPelUrt/uzvz+GO16pTudzpIsnfB+Hj167nbfm5mdnXnnnXfeMmnTl//684O/avE+M9u83zZ4+nkjZZ8vlJpVACCLOL383GkCCbkdOZnZe7DLXe+VKg++dc3lr4aMYvCHpDJ3/fGj3rNmTaEhX4CknDW16KMtMtNxIkCiKAmtink2GlFADBxq9Fc4/3L1Ir8fB8iQ7FClJHmTh00fYRBFCQDzQiwaTa/XizFm+TtMJpPqzcHQBb+PyFH8rVZrQ0ODGue3s27FCAjixk6c51r+xLOzXvi5w2AAgOaqA5IlM8G18ts9vrKJFoDA0d2NaQMGcAaXgUMSAd5gIFxIIkEKBgNPRUIlGbCR83n31TULWQ4hsH7rscL0UsH8leAmwQRe4IF3NbtNAo84gQQlLi07xWhosaJQdsnN/3jsbAHcR3c6H*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" alt="" />

nova启动时使用service命令,如下图:

openstack服务启动之nova-compute

service命令实际上是调用/etc/init.d/nova-compute来实现的。在/etc/init.d/文件下有一个nova-compute脚本,负责nova-compute的启动,停止,状态查询等。

openstack服务启动之nova-compute

openstack服务启动之nova-compute

/etc/init.d/nova-compute脚本的执行是通过/etc/init/nova-compute.conf中的配置项来完成的,下面看看nova-compute.conf文件中的内容。

openstack服务启动之nova-compute

/etc/init/nova-compute.conf

 #!/bin/sh
### BEGIN INIT INFO
# Provides: nova-compute
# Required-Start: $network $local_fs $remote_fs $syslog
# Required-Stop: $remote_fs
# Should-Start: libvirt-bin postgresql mysql keystone rabbitmq-server ntp neutron-ovs-cleanup
# Should-Stop: libvirt-bin postgresql mysql keystone rabbitmq-server ntp
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Nova Compute server
# Description: Provides compute server resources for the
# OpenStack cloud computing system
### END INIT INFO # Author: Julien Danjou <acid@debian.org> # PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="OpenStack Compute"
PROJECT_NAME=nova
NAME=${PROJECT_NAME}-compute
DAEMON_ARGS=""
if [ -f '/etc/nova/nova-compute.conf' ] ; then
DAEMON_ARGS="--config-file=/etc/nova/nova-compute.conf"
fi #!/bin/sh
# The content after this line comes from openstack-pkg-tools
# and has been automatically added to a .init.in script, which
# contains only the descriptive part for the daemon. Everything
# else is standardized as a single unique script. # Author: Thomas Goirand <zigo@debian.org> # PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin if [ -z "${DAEMON}" ] ; then
DAEMON=/usr/bin/${NAME}
fi
PIDFILE=/var/run/${PROJECT_NAME}/${NAME}.pid
if [ -z "${SCRIPTNAME}" ] ; then
SCRIPTNAME=/etc/init.d/${NAME}
fi
if [ -z "${SYSTEM_USER}" ] ; then
SYSTEM_USER=${PROJECT_NAME}
fi
if [ -z "${SYSTEM_GROUP}" ] ; then
SYSTEM_GROUP=${PROJECT_NAME}
fi
if [ "${SYSTEM_USER}" != "root" ] ; then
STARTDAEMON_CHUID="--chuid ${SYSTEM_USER}:${SYSTEM_GROUP}"
fi
if [ -z "${CONFIG_FILE}" ] ; then
CONFIG_FILE=/etc/${PROJECT_NAME}/${PROJECT_NAME}.conf
fi
LOGFILE=/var/log/${PROJECT_NAME}/${NAME}.log
if [ -z "${NO_OPENSTACK_CONFIG_FILE_DAEMON_ARG}" ] ; then
DAEMON_ARGS="--config-file=${CONFIG_FILE} ${DAEMON_ARGS}"
fi # Exit if the package is not installed
[ -x $DAEMON ] || exit 0 # If ran as root, create /var/lock/X, /var/run/X, /var/lib/X and /var/log/X as needed
if [ `whoami` = "root" ] ; then
for i in lock run lib ; do
mkdir -p /var/$i/${PROJECT_NAME}
chown ${SYSTEM_USER}:${SYSTEM_GROUP} /var/$i/${PROJECT_NAME}
done
for i in log ; do
mkdir -p /var/$i/${PROJECT_NAME}
chown ${SYSTEM_USER}:adm /var/$i/${PROJECT_NAME}
done
fi # This defines init_is_upstart which we use later on (+ more...)
. /lib/lsb/init-functions # Manage log options: logfile and/or syslog, depending on user's choosing
[ -r /etc/default/openstack ] && . /etc/default/openstack
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
[ "x$USE_SYSLOG" = "xyes" ] && DAEMON_ARGS="$DAEMON_ARGS --use-syslog"
if [ -z "${NO_OPENSTACK_LOGFILE_DAEMON_ARG}" ] ; then
[ "x$USE_LOGFILE" != "xno" ] && DAEMON_ARGS="$DAEMON_ARGS --log-file=$LOGFILE"
fi do_start() {
start-stop-daemon --start --quiet --background ${STARTDAEMON_CHUID} --make-pidfile --pidfile ${PIDFILE} --chdir /var/lib/${PROJECT_NAME} --startas $DAEMON \
--test > /dev/null || return 1
start-stop-daemon --start --quiet --background ${STARTDAEMON_CHUID} --make-pidfile --pidfile ${PIDFILE} --chdir /var/lib/${PROJECT_NAME} --startas $DAEMON \
-- $DAEMON_ARGS || return 2
} do_stop() {
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE
RETVAL=$?
rm -f $PIDFILE
return "$RETVAL"
} do_systemd_start() {
exec $DAEMON $DAEMON_ARGS
} case "$1" in
start)
init_is_upstart > /dev/null 2>&1 && exit 1
log_daemon_msg "Starting $DESC" "$NAME"
do_start
case $? in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
stop)
init_is_upstart > /dev/null 2>&1 && exit 0
log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case $? in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
systemd-start)
do_systemd_start
;;
restart|force-reload)
init_is_upstart > /dev/null 2>&1 && exit 1
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case $? in
0|1)
do_start
case $? in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*) log_end_msg 1 ;; # Failed to stop
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload|systemd-start}" >&2
exit 3
;;
esac exit 0

/etc/init/nova-compute.conf

 # vim: set ft=upstart et ts=2:
description "Nova compute worker"
author "Soren Hansen <soren@linux2go.dk>" start on runlevel [2345]
stop on runlevel [!2345] chdir /var/run env MAX_STATUS_CHECK_RETRIES=20 pre-start script
mkdir -p /var/run/nova
chown nova:root /var/run/nova/ mkdir -p /var/lock/nova
chown nova:root /var/lock/nova/ # Only try to modprobe if not running within a container
if [ ! -f /run/container_type ]; then
modprobe nbd
fi # If libvirt-bin is installed, always wait for it to start first
if status libvirt-bin; then
start wait-for-state WAIT_FOR=libvirt-bin WAIT_STATE=running WAITER=nova-compute
fi # If installed, wait for neutron-ovs-cleanup to complete prior to starting
# nova-compute.
if status neutron-ovs-cleanup; then
# See LP #1471022 for explanation of why we do like this
retries=$MAX_STATUS_CHECK_RETRIES
delay=1
while true; do
# Already running?
s=`status neutron-ovs-cleanup`
echo $s
`echo $s| grep -qE "\sstart/running"` && break
if retries=`expr $retries - 1`; then
# Give it a push
echo "Attempting to start neutron-ovs-cleanup"
start neutron-ovs-cleanup || :
# Wait a bit to avoid hammering ovs-cleanup (which itself may be waiting
# on dependencies)
echo "Recheck neutron-ovs-cleanup status in ${delay}s"
sleep $delay
if _=`expr $retries % 2`; then
delay=`expr $delay + 2`
fi
else
echo "Max retries ($MAX_STATUS_CHECK_RETRIES) reached - no longer waiting for neutron-ovs-cleanup to start"
break
fi
done
fi
end script exec start-stop-daemon --start --chuid nova --exec /usr/bin/nova-compute -- --config-file=/etc/nova/nova.conf --config-file=/etc/nova/nova-compute.conf

其中最后一行代码是关键代码,这个脚本之所以能启动是执行了nova-compute的可执行脚本,位置在/usr/bin/nova-compute。

/usr/bin/nova-compute

 #!/usr/bin/python
# PBR Generated from u'console_scripts' import sys from nova.cmd.compute import main if __name__ == "__main__":
sys.exit(main())

该脚本导入了/nova/cmd/compute中的main函数来完成启动任务。

/nova/nova/cmd/compute

 # Copyright 2010 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License. """Starter script for Nova Compute.""" import shlex
import sys import os_vif
from oslo_log import log as logging
from oslo_privsep import priv_context
from oslo_reports import guru_meditation_report as gmr from nova.cmd import common as cmd_common
from nova.conductor import rpcapi as conductor_rpcapi
import nova.conf
from nova import config
from nova import objects
from nova.objects import base as objects_base
from nova import service
from nova import utils
from nova import version CONF = nova.conf.CONF
LOG = logging.getLogger('nova.compute') def main():
config.parse_args(sys.argv)
logging.setup(CONF, 'nova')
priv_context.init(root_helper=shlex.split(utils.get_root_helper()))
utils.monkey_patch()
objects.register_all()
# Ensure os-vif objects are registered and plugins loaded
os_vif.initialize() gmr.TextGuruMeditation.setup_autorun(version) cmd_common.block_db_access('nova-compute')
objects_base.NovaObject.indirection_api = conductor_rpcapi.ConductorAPI() server = service.Service.create(binary='nova-compute',
topic=CONF.compute_topic)
service.serve(server)
service.wait()
 # Copyright 2010 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
# Copyright 2012 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License. from oslo_log import log from nova.common import config
import nova.conf
from nova.db.sqlalchemy import api as sqlalchemy_api
from nova import rpc
from nova import version CONF = nova.conf.CONF def parse_args(argv, default_config_files=None, configure_db=True,
init_rpc=True):
log.register_options(CONF)
# We use the oslo.log default log levels which includes suds=INFO
# and add only the extra levels that Nova needs
if CONF.glance.debug:
extra_default_log_levels = ['glanceclient=DEBUG']
else:
extra_default_log_levels = ['glanceclient=WARN']
log.set_defaults(default_log_levels=log.get_default_log_levels() +
extra_default_log_levels)
rpc.set_defaults(control_exchange='nova')
config.set_middleware_defaults() CONF(argv[1:],
project='nova',
version=version.version_string(),
default_config_files=default_config_files) if init_rpc:
rpc.init(CONF) if configure_db:
sqlalchemy_api.configure(CONF)

/nova/nova/service.py

 class Service(service.Service):
"""Service object for binaries running on hosts. A service takes a manager and enables rpc by listening to queues based
on topic. It also periodically runs tasks on the manager and reports
its state to the database services table.
""" def __init__(self, host, binary, topic, manager, report_interval=None,
periodic_enable=None, periodic_fuzzy_delay=None,
periodic_interval_max=None, db_allowed=True,
*args, **kwargs):
super(Service, self).__init__()
self.host = host
self.binary = binary
self.topic = topic
self.manager_class_name = manager
self.servicegroup_api = servicegroup.API()
manager_class = importutils.import_class(self.manager_class_name)
self.manager = manager_class(host=self.host, *args, **kwargs)
self.rpcserver = None
self.report_interval = report_interval
self.periodic_enable = periodic_enable
self.periodic_fuzzy_delay = periodic_fuzzy_delay
self.periodic_interval_max = periodic_interval_max
self.saved_args, self.saved_kwargs = args, kwargs
self.backdoor_port = None
self.conductor_api = conductor.API(use_local=db_allowed)
self.conductor_api.wait_until_ready(context.get_admin_context())

/nova/nova/service.py

 @classmethod
def create(cls, host=None, binary=None, topic=None, manager=None,
report_interval=None, periodic_enable=None,
periodic_fuzzy_delay=None, periodic_interval_max=None,
db_allowed=True):
"""Instantiates class and passes back application object. :param host: defaults to CONF.host
:param binary: defaults to basename of executable
:param topic: defaults to bin_name - 'nova-' part
:param manager: defaults to CONF.<topic>_manager
:param report_interval: defaults to CONF.report_interval
:param periodic_enable: defaults to CONF.periodic_enable
:param periodic_fuzzy_delay: defaults to CONF.periodic_fuzzy_delay
:param periodic_interval_max: if set, the max time to wait between runs """
if not host:
host = CONF.host
if not binary:
binary = os.path.basename(sys.argv[0])
if not topic:
topic = binary.rpartition('nova-')[2]
if not manager:
manager_cls = ('%s_manager' %
binary.rpartition('nova-')[2])
manager = CONF.get(manager_cls, None)
if report_interval is None:
report_interval = CONF.report_interval
if periodic_enable is None:
periodic_enable = CONF.periodic_enable
if periodic_fuzzy_delay is None:
periodic_fuzzy_delay = CONF.periodic_fuzzy_delay debugger.init() service_obj = cls(host, binary, topic, manager,
report_interval=report_interval,
periodic_enable=periodic_enable,
periodic_fuzzy_delay=periodic_fuzzy_delay,
periodic_interval_max=periodic_interval_max,
db_allowed=db_allowed) return service_obj

/nova/nova/service.py

 def serve(server, workers=None):
global _launcher
if _launcher:
raise RuntimeError(_('serve() can only be called once')) _launcher = service.launch(CONF, server, workers=workers)

未完待续。。。。。

上一篇:HBase各版本对Hadoop版本的支持情况


下一篇:HTTP协议笔记整理