Acronime folosite: [304395]
Acronime folosite:
OS – Operating System (Sistem de operare)
API – Application program interface (Interfața program de aplicație)
MAC-Media Access Control (Controlul accesului media)
IoT – Internet of Things (Internetul lucrurilor)
IoE – Internet of Everything (Internetul tuturor)
VM – Virtual Machine (Mașină virtuală)
GNU – General Public License (Licența publică generală)
JSON – JavaScript Object Notation (Notația obiectului JavaScript)
LAN – Local Area Network (Retea locala)
WAN – Wide Area Network (Arie largă de rețea)
SaaS – Software as a Service (Softwar-ul ca serviciu )
PaaS – Platform as a Service (Platforma ca serviciu )
IaaS – Infrastructure as a Service (Infrastructura ca serviciu)
IP – Internet Protocol (Protocolul Internetului)
IT-Information Technology (Tehnologia informației)
AMQP – AdvanceD Message Queuing Protocol (Protocolul avansat de redirecționare a mesajelor)
DHCP- [anonimizat] (Transferul de stat reprezentativ)
DC – Domain Controller (Controlerul domeniului)
DB – DataBase (Baza de date)
Tema de proiectare
Se va instala și configura un sistem de cloud privat OpenStack care va fi folosit pentru a oferi sisteme de operare Linux pentru laboratorul T201.
Se va investiga necesarul hardware și software pentru implementarea unui laborator pentru servicii de cloud la disciplină Rețele Locale de Calculatoare.
Se va proiecta o aplicație în limbajul C# care să afle informații despre starea platformei OpenStack. Aplicația:
Va interoga de la distanță serviciile oferite de sistemul de cloud privat OpenStack folosind OpenStack web API;
[anonimizat], va fi procesat iar informațiile extrase vor fi afișate pe ecran.
Capitolul 1 Introducere
1.1 Actualitatea temei
1.1.1 Virtualizarea
Virtualizarea este un cuvânt cheie în domeniul tehnologiei informației si se referă la actul de creare a [anonimizat] a platformelor hardware, a sistemelor de operare, a dispozitivelor de stocare și a resurselor de rețea.
Virtualizarea este o tehnologie care partajează și alocă resursele hardware ale unui server în mai multe “mașini virtuale”.
[anonimizat] a mai multor sisteme de operare pe un singur computer.
În cazul în care o [anonimizat], separate, chiar dacă ele se află pe același spațiu fizic. [anonimizat] a [anonimizat] a firmei nu este deloc afectată.
Avantajele virtualizării
Putem rula mai multe sisteme de operare pe o singură mașină ([anonimizat]);
Rulam Windows virtual pe sistemul Mac pentru a vă asigura rularea aplicațiilor Windows;
[anonimizat];
Ne asigura că aplicațiile noastre rulează cu o disponibilitate ridicată și cu performanță maximă;
Se îmbunătățesc sistemele de tip desktop control și management cu soluții de instalare rapidă și prin reducerea numărului de incidente cauzat de incompatibilitățile software ;
Exemplu de platforme pentru virtualizare:
utilizează un singur sistem de calcul: VMWare și Virtualbox.
Cu structura modulara (multe sisteme de calcul lucrează împreună pentru a asigura serviciile platformei), care pot face față la mii de utilizatori: OpenStack și Cloud Stack.
Transformarea sistemelor hardware în aplicații și servicii software care rulează pe o infrastructură dedicată este o tendință care a apărut de câțiva ani și care transformă industria de specialitate prin creșterea flexibilității infrastructurii și scăderea costurilor pentru achiziții hardware.
1.1.2 Componentele unui sistem de calcul
În sistemele clasice, componentele unui sistem de calcul sunt:
Hardware-ul : furnizează resurse precum: procesor, memorie, periferice.
Sistemul de operare : pune la dispoziția utilizatorului și a programelor resursele hardware. Sistemele de operare au avut o evoluție continuă de la simplul suport pentru execuție către sisteme complexe de gestionare a resurselor care ușurează sarcinile utilizatorului.
Programe de aplicație: pe baza sistemului de operare rulează programe de aplicație. Programele de aplicație definesc căile prin care resursele sistemului sunt utilizate pentru rezolvarea problemelor de calcul ale utilizatorilor.
Utilizatorii pot fi persoane, mașini sau alte calculatoare.
Figura 1.1 : Componentele unui sistem de calcul
În sistemele cu virtualizare se interpune un strat suplimentar între sistemul de operare folosit de utilizator și hardware, strat numit Hypervisor. Acesta este de obicei încorporat într-un sistem de operare dedicat și transpune componentele hardware ale mașinii reale în componente hardware abstractizate sistemului de operare folosit de utilizator.
Figura 1.2 Arhitectura traditionala vs Arhitectura virtuala
1.2.3 Cloud computing
Cloud-ul este tot un termen care a căpătat o răspândire mare în ultimii ani, deși drept concept este apărut din anii ´90. Ideea principală este transformarea în servicii disponibile online a tuturor resurselor: hardware și software. În acest mod pot fi realizate câteva deziderate ale industriei IT:
posibilitatea identificării și taxării diferențiate a utilizatorilor în funcție de timpul și resursele utilizate din cloud;
reducerea costurilor de achiziție pentru echipamentele utilizate temporar prin „închirierea” acestora pe durată determinată;
securizarea accesului la hardware și software.
La începutul anilor 1990 inginerii au început să folosească cloud-ul ca fiind o metaforă pentru internet . Structura internetului așa cum se vede de la distanță este ca un nor(cloud). Ulterior cloud-ul a fost folosit ca o modalitate de a reprezenta serviciile bazate pe Internet.
Apple iCloud, Google Cloud Platform, Microsoft OneDrive, toate sunt servicii care rulează în cloud. Acest lucru este necesar pentru a putea oferi clienților situați pe toată suprafața pământului acces la același set de date, în oricare locație s-ar afla la un moment dat.
Figura 1.3 Evoluția numărului de dispozitive
Din punct de vedere al implementării hardware, o platformă de cloud este instalată pe zeci de mii de calculatoare situate într-un datacenter. Firmele mari precum Microsoft, Amazon, Apple sau Google au multiple locații datacenter la nivel global. Serviciile sunt accesate prin cel mai apropiat datacenter pentru o viteză mai mare de acces.
Cloud computing reprezintă un ansamblu distribuit de servicii de calcul, acces la informații și stocare de date, care nu necesită ca utilizatorii să cunoască configurația fizică a sistemelor care furnizează aceste servicii.
Cloud computing este aparent o idee simplă care ascunde o complexitate de informații și de caracteristici.
IoT (Internetul obiectelor) și IoE (Internetul tuturor) sunt cuvinte cheie strâns legate de conceptul de cloud, deoarece ele identifică un număr foarte mare de dispozitive cu o putere de procesare limitată care au rolul să adune informații în timp real de la sisteme. Puterea de calcul limitată face imposibilă prelucrarea locală a datelor, din acest motiv ele trimit datele achiziționate la un sistem virtual plasat în Cloud, acest sistem stochează aceste informații pentru a putea fi procesate ulterior de la alte sisteme de servicii cloud.
Dispozitivele IoT, până în anii 2020, vor produce cantități uriașe de date. Există câteva abordări pentru gestionarea și procesarea tuturor acestor date. Unele companii dezvoltă și vând propriile lor soluții, iar altele nu au capacitatea de a implementa o infrastructură completă și preferă să se bazeze pe terți publici sau comerciali.
Openstack este o platformă deschisă pentru cloud computing acționând la nivelul cel mai apropiat de hardware IaaS (Infrastructure aș a Service) al virtualizării, care permite crearea de servere virtuale și conectarea acestora între ele prin rețele virtuale. Administrarea platformei OpenStack se poate face în modul grafic, în linie de comandă, sau prin folosirea unui set de funcții web dedicate (accesate prin HTTP sau HTTPS).
Termenul „cloud” se referă la locații din Internet, în care putem salva toate tipurile de informații, inclusiv fotografii, muzică, documente, înregistrări video, practic orice funcționează ca fișiere și pe care le puteți obține cu ușurință ulterior de pe un computer, un telefon, un televizor sau un alt dispozitiv care are conexiune Internet;
Cloud computing reprezintă accesarea de resurse hardware și software, prin intermediul internetului. Toate aceste cereri se vor trimite sub formă de servicii.
Altfel spus, cloud computing-ul este expresia folosită pentru a descrie diferite situatii prin care resursa de calcul este trimisa sub forma unui serviciu printr-o conexiune de rețea. Capacitatea unui sistem de a se adapta la schimbari este volumul de muncă, acest lucru se caracterizează prin principalele caracteristici ale tehnologiei cloud: flexibilitate si scalabilitate.Cloud computing permite furnizarea automată de resurse atunci cand este necesar, asigurandu-se ca nivelul resurselor disponibile este direct proporțional cu cererea acestora.
Cu toate acestea, firmele pot beneficia din economii create prin inființarea de servicii in masa cu aceleași avantaje precum flexibilitatea si fiabilitatea de servicii de fosting fizic pe mai multe servere unde erorile individuale ale sistemului, nu pot afecta continuitatea serviciului.
Această lucrare este structurată în felul următor:
în capitolul 1 sunt prezentate aspecte teoretice privind virtualizarea, sistemele cloud și tehnologiile folosite în acest proiect;
în capitolul 2 se prezintă proiectarea sistemului hardware și a aplicației software;
în capitolul 3 se discută implementarea aplicației realizate;
în capitolul 4 este realizată o și sunt evidențiate problemele întâmpinate;
În capitolul de concluzii sunt menționate aspectele realizate și posibile dezvoltări ulterioare.
Studiul teoretic
1.3.1 OpenStack
OpenStack reprezintă cea mai populară și solidă platformă Open Source pentru Cloud Computing. OpenStack lucrează cu o mulțime de aplicații din gama Enterprise sau Open Source făcând din acest soft un suport ideal pentru companiile mari.
Mai precis, deși, este o colecție de software Open Source, care permite să îndeplinească anumite funcții pe cloud OpenStack a fost un proiect pilot lansat de Rackspace și NASA, fiind fondat în iulie 2010. Proiectul OpenStack a fost destinat să ajute organizațiile deoarece oferă servicii de cloud computing care rulează pe hardware-ul standard.
Membrii premium ai fundației OpenStack sunt:
1.3.2 Componente OpenStack
OpenStack este format din mai multe componente diferite în continuă mișcare. Din cauza naturii sale deschise, oricine poate adăuga elemente suplimentare pentru a ajuta la îmbunătățirea OpenStack. În prezent OpenStack este format din 9 componente principale:
OpenStack Compute (nova):
OpenStack Compute (nume de cod NOVA), este motorul de calcul primar al infrastructurii OpenStack. Acesta este utilizat pentru implementarea și gestionarea unui număr mare de mașini virtuale.
Nova interacționează puternic cu alte servicii cum ar fi: OpenStack Keystone pentru efectuarea autentificării, Horizon pentru interfața sa web, Glance pentru furnizarea imaginilor și altele.
Block Storage (Cinder):
Această componentă OpenStack (Cinder) oferă spațiu de stocare block pentru instanțele aflate în execuție. Arhitectura sa facilitează crearea și gestionarea dispozitivelor de stocare a blocului.
Cinder oferă de asemenea stocarea de baza cum ar fi: snapshot sau clone aceastea crează instantaneu copierea de rezervă a datelor stocate pentru a putea fi utilizate sau restaurate.
Object Storage (swift):
Swift a fost creat ca o platformă de stocare distribuită, care poate fi integrată direct în aplicații fiind utilizată pentru a stoca imagini VM, backup-uri, și arhive precum și fișiere mai mici, cum ar fi fotografii sau mesaje de e-mail.
Există două componente de bază ale Object Storage : “object” și “containers”.
Un obiect este entitatea de stocare primară iar un container este un compartiment de depozitare pentru un set de fișiere.
Spre deosebire de un set de fișiere obișnuit Swift este distribuit pe mai multe sisteme. Acesta stochează automat copii fiecărui obiect pentru a maximiza disponibilitatea și scalabilitatea. Oferă o protecție suplimentară împotriva pierderii accidentale a datelor sau a suprascrierii acestora.
OpenStack Networking (Neutron):
OpenStack Networking este un serviciu independent care desfășoară simultan mai multe procese într-un număr de noduri. Aceste procese interacționează unele cu altele și cu serviciile Openstack.Principalul proces al OpenStack Networking este neutron-server.
Neutron-server – acest serviciu rulează pe nodul de rețea pentru a deservi API-ul Networking și extensiile sale. Se impune de asemenea modul de rețea și adresa IP a fiecărui port. Neutron-server necesită în permanență acces la o bază de date. Acest lucru este realizat prin intermediul pluginuri-lor, care comunică cu baza de date folosind AMQP (Advanced Message Queuing Protocol).
Plugin agent (neutron – agent) Rulează pe fiecare nod de calcul pentru a gestiona configurația locală virtual swith (vswitch).
DHCP agent (neutron-DHCP-agent)
Oferă servicii DHCP pentru rețele tenant. Acest agent este același în toate plugin-urile și este responsabil pentru menținerea configurației DHCP.
Image service (Glance)
Serviciul de imagine OpenStack oferă descoperirea, înregistrarea și restaurarea imaginilor mașinii virtuale.Glance are o arhitectură client-server care oferă un REST API pentru utilizator, prin care cererea la server poate fi realizată.
Glance Domain Controller (DC) gestionează operațiunile interne ale server-ului, acesta fiind împărțit în straturi.
Toate operațiunile fișierelor sunt realizate folosind biblioteca glance_store, care este responsabilă cu interacțiunea dintre stocarea externă și sistemul de fișiere local.
Glance folosește o bază de date sql (DB), care este partajată în toate componentele sistemului.
Dashboad (Horizon)
Horizon este tabloul de bord din spatele OpenStack. Tabloul de bord oferă administratorilor și utilizatorilor o interfață grafică pentru accesarea, furnizarea și automatizarea resurselor bazate pe cloud.
Tabloul de bord poate fi făcut de asemenea de brand special pentru furnizorii de servicii sau alte companii care au nevoie de personalizare.Acesta oferă utilizatorilor un portal self-service pentru furnizarea de resurse propii în limitele stabilite de către administratori.
Identity Service (Keystone)
Keystone reprezintă serviciul de autentificare folosit de OpenStack pentru autentificare (authN) și autorizare la nivel înalt (authZ).
Serviciul de autentificare OpenStack permite:
Configurarea poiliticilor centralizate între utilizatori și sisteme;
Crearea de noi utilizatori și definirea permisiunile pentru resursele de Compute, Storage și Networking;
Integrarea cu directoare existente, permițând o singură sursă de autentificare a indentitații;
Heat (Orchestrarea)
Misiunea OpenStack Heat este de a crea un serviciu accesibil pentru gestionarea întregului ciclu de viață al infrastructurii și a cerințelor de cloud OpenStack.OpenStack Heat este destinat în mare parte pentru a facilita deplasarea volumului de muncă de la AWS (Amazon Web Services) la Openstack.
Ceilometer(Telemetry)
Proiectul Ceilometer reprezintă un serviciu de colectare a datelor, care oferă posibilitatea de a normaliza și de a transforma datele din toate componentele de bază OpenStack.
Obiectivele sale principale sunt de monitorizare și măsurare, în acest sens ar trebui să poată partaja datele acumulate, cu o varietate de consumatori.
1.3.3 Serviciile OpenStack
Cu alte cuvinte, o companie din domeniul IT, care deține aceste resurse (infrastructură, servere, aplicații) pune la dispoziția companiilor o parte din aceste resurse sub formă de servicii:
SaaS – Software as a Service (softwar-ul ca serviciu )
PaaS – Platform as a Service ( platforma ca serviciu )
IaaS – Infrastructure as a Service ( infrastructura ca serviciu)
Figura 1.4 Caracteristicile IAAS, PAAS, SAAS
Software-ul ca serviciu (SaaS):
Software-ul ca serviciu (SaaS): Acesta oferă consumatorilor posibilitatea de a accesa aplicații software direct pe internet. Clienții au acces la aplicațiile SaaS prin intermediul unui browser web ceea ce înseamnă că nu este nevoie de nici un hardware sau software care necesită cumpărat sau instalat. Furnizorii serviciilor SaaS se ocupă de toate acestea, iar clienții beneficiază întotdeauna de cea mai recentă versiune a aplicației.
Toate aplicațiile se găsesc în ‘cloud’ și pot fi utilizate într-o gamă largă de necesități în special pentru utilizatorii din categoria Enterprise (firme), spre exemplu: contabilitate și facturare, planificare, urmărirea vânzărilor, comunicații și monitorizarea performanțelor.
Există o gamă largă de avantaje ale serviciior SaaS atât pentru utilizatorii personali cât și pentru organizații:
Nu există costuri hardware suplimentare;
Nu există costuri suplimentare pentru instalare;
Dacă utilizatorii decid că au nevoie de mai mult spațiu de stocare sau de mai multe servicii suplimentare, atunci ei le pot accesa la cerere fără a fi nevoie de a instala echipamente software sau hardware noi;
Toate actualizările sunt automate – orice actualizare este disponibilă online pentru clienții existenți fără a necesita costuri suplimentare;
Aplicațiile SaaS pot fi accesate din orice locație cu ajutorul unui dispozitiv conectat la internet spre deosebire de aplicațiile software instalate pe calculatoarele individuale;
Aplicații SaaS pot fi modificate în conformitate cu nevoile fiecărui client.
Exemple de servicii SaaS:
Twiter
Flickr
Platform as a Service (Platforma ca serviciu)
PaaS (platforma ca serviciu) – acesta ofera posibilitatea consumatorilor de a utilza aplicațiile oferite de furnizori. Serviciile PaaS sunt stocate în cloud și pot fi accesate de către utilizatori direct prin intermediul unui browser web. Consumatorii nu pot controla sau gestiona infrastructura cloud, dar au controlul asupra aplicațiilor implementate și a setărilor acestora.
Serviciile PaaS sunt actualizate în permanență : opțiunile existente fiind modernizate (update) si adăugate alte caracteristici suplimentare. Plata acestor servicii se face în general pe baza unui abonament , clinții plătesc doar ceea ce folosesc. Aceștia beneficiază de reduceri substanțiale care apar în urma utilizării în comun a infrastructurii fizice între utilizatori, ducând la costuri mult mai mici.
Avantajele serviciilor PaaS:
Clinții au posibilitatea de a închiria resursele de care au nevoie, fără a avea nevoie să achiziționeze hardware sau să angajeze personal. Acest lucru le conferă libertatea de a se implica doar în dezvoltarea aplicațiilor.
Flexibilitatea – Clienții dețin controlul asupra intrumentelor instalate în platformele lor si pot crea propria platformă care se încadrează cerințelor proprii.
Adaptabilitate – Echipa poate fi repartizată în mai multe locații iar membrii echipei pot lucra împreună. Este necesară o conexiune la internet și browswe-ul web pentru a lucra împreună la implementarea aceleași aplicații.
Câteva caracteristici incluse în oferta PaaS:
Sistem de operare;
Suport tehnic;
Spațiu de depozitare (cloud);
Accesul la rețea;
Instrumente pentru dezvoltare;
Mediu server side scripting;
Sistemul de gestionare al bazelor de date;
Server software;
Infrastructure as a Service (Infrastructura ca serviciu)
IaaS – Infrastructrura ca serviciu, oferă acces la resursele de calcul, clientul având acces la componentele virtualizate în scopul de a construi propriile sale platforme IT.
Serviciile IaaS pot fi utilizate de către toți clienții firmelor pentru a crea soluții eficiente și scalabile. În cazul în care un utilizator dorește să se extindă, acesta poate accesa resursele din cloud fără a fi nevoie să le cumpere sau să le instaleze.
IaaS oferă următoarele caracteristici și avantaje:
Scalabilitatea resurselor: resursele dorite pot fi aprovizionate ușor și rapid. Astfel clienții pot beneficia de o putere de calcul adaptată nevoilor, fără a fi nevoiți să să cheltuie sume mari de bani pentru aprovizionarea unor echipamente IT.
Nu este nevoie de nici o investiție în hardware: hardware-ul de baza acceptă servicii IaaS și este configurat de către furnizorul serviciilor cloud, ajutând la economisirea costurile și timpului de lucru;
Securitatea sporită a locației centrelor de date: Data Center-ul în care sunt stocate echipamentele componente ale serviciilor IaaS, se bucură de tehnologii noi cum ar fi:sisteme de răcire, sisteme avansate de electroalimentare , un grup generator capabil să susțină puterea electrică necesară , sisteme performante de securitate și sisteme de supraveghere IP dedicate.
Beneficiera de tehnologii IT de ultimă generație la prețuri mici : Clientul nu este nevoit să achizitionele echipamente noi.Echipamentele sunt întreținute de către specialiștii IaaS, astfel încât clienții să se bucure de servicii de cea mai bună calitate.
Pentru laboratorul T201 al Universității din Pitești în care se predă cursul de Sisteme de operare, o problemă identificată a fost aceea de a acorda fiecărui student conectat propriul sistem de operare, pe care să ruleze aplicațiile de laborator și care să fie șters (resetat la configurația inițiala) la sfârșitul laboratorului pentru a nu afecta alți studenți care vor lucra în continuare.
Acest lucru se realizează în prezent prin folosirea sistemelor de operare live CD cum ar fi Knoppix, care oferă un sistem de operare temporar care rulează de pe CD și din memoria calculatorului. Această metodă de lucru are limitări, impuse de modul de funcționare și are o viteză redusă la încărcarea aplicațiilor deoarece acestea sunt citite de pe CD. Suplimentar, dacă sistemul nu are CD, este necesară utilizarea unui stick USB predispus la infectarea cu viruși.
În acest context OpenStack permite unui administrator să creeze o mașină virtuală rulând un sistem de operare cu doar câteva instrucțiuni și în câteva minute. Mașina poate fi oprită, pornită sau ștearsă foarte rapid. Totodată se pot crea zeci de astfel de mașini pe un singur calculator fără o încărcare semnificativă a acestuia.
OpenStack este doar una dintre alternativele disponibile. Alte soluții, precum CloudStack, sunt însă proprietare.
1.3.4 Open source
Open Source (sursă deschisă) reprezintă software-ul dezvoltat de către o companie sau de către o persoană, care oferă accesul tuturor utilizatorilor la codul sursă.
Caracteristică de bază a acestui software o reprezintă libertatea acordată utilizatorilor de a-l utiliza, distribuii, copia, și modifica.
O aplicație o putem numii software liber atunci când îndeplinește următoarele condiții:
Libertatea de a rula programul oricând în orice scop commercial, personal sau științific, pe orice sistem de operare.
Libertatea de a studia modul de funcționare al aplicației și de a o adapta nevoilor proprii în scopuri educative, personale sau commerciale.
Libertatea de a modifica și îmbunătății programul pentru a-l adapta nevoilor proprii, fără a avea costuri suplimentare.
Libertatea de a face publice modificările, cu obligația de a le include în același tip de licență și de a menționa autorul original al programului/aplicației.
Un exemplu real al software-ului Open Source : În 1991, Linus Torvalds, student al Universității Helsinki din Finlanda, a lansat un nou sistem de operare bazat pe Minix, un derivat al Unixului, pe care l-a numit Linux. Torvalds a lansat versiunea Linux-ului sub licența GNU General Public License, care oferă o bună definiție pentru software-ul Open Source. Mulți oameni din întreaga lume au descărcat Linux gratuit și au început să lucreze cu acesta. Mulți dintre aceștia fiind programatori au contribuit la îmbunătățirea codului sursă. Mai târziu Torvalds a primit alte versiuni modificate de la ceilalți programatori și au lansat alte versiuni mai complexe.
În general, când vorbim de Open Source vorbim defapt despre: Licența GNU General Public Licence , Scopul licenței este de a încuraja orice utilizator de a copia, modifica și redistribui programe și coduri sursă ale programatorilor.
O preocupare comună a tuturor utilizatorilor finali care doresc să utilizeze software-ul Open Source este lipsa unei garanții și a unui suport tehnic.
1.3.5 JSON
JSON este prescurtarea de la JavaScript Object Notation și este o modalitate de a stoca informații într-un mod organizat, ușor de accesat.
JSON este un format de text care este complet independent, dar folosește convențiile care sunt familiare programatorilor de C , C++, C#,Java, JavaScript,Perl, Python, și multe altele.
JSON este construit din două structuri:
O colecție de perechi nume/valori. În diferite limbi acest lucru este realizat că un obiect, înregistrare, structura, dicționar și altele.
O listă ordonată, în multe limbi diferite acest lucru este realizat ca o matrice, vector, listă sau secvență.
Acestea sunt structuri de date universal folosite de toate limbajele de programare moderne.
În JSON ele iau aceste forme: un obiect este un set neordonat de perechi nume / valoare. Un obiect începe cu “{“ și se termină cu “}”.
Exemplu:
obiect
{}
{ membri}
membri
pereche
pereche , membrii
pereche
strâng : valoare
matrice
[]
[ elemente]
element
valoare
valoare , elemente
valoare
șir de
numărul de
obiect
matrice
adevărat
fals
nul
În JSON ele iau aceste forme: un obiect este un set neordonat de perechi nume / valoare. Un obiect începe cu “{“ și se termină cu “}”.
Exemplu json:
{
"name":"Mihai",
"varsta":23,
"cars": [ "volkswagen", "BMW", "Audi" ]
}
1.3.6 Evoluție structuri pentru virtualizare
Mainframe
Mainframe a apărut începând cu anul 1960 și reprezentau grupuri mari de calculatoare, cu putere mare de calcul a căror caracteristici principale erau securitatea și redundanța hardware. Datele erau introduce în istoric: cartele găurite și benzi magnetice. În zilele noastre pot fi configurate din interfața Web. Puterea s-a redus substanțial în anii 90 când s-a realizat trecerea de la tehnologia bipolară la tehnologia CMOS. Scopul acestora îl reprezenta realizarea aplicațiilor care necesitau putere mai mare de calcul.
Cluster
Primele forme Now (Anderson, Culler, Patterson, 1995) și Beowulf (Sterling, și alții, 1995), au apărut în perioada anilor 1994, având scopul de a împărți puterea de calcul a mai multor sisteme independente, astfel încât din exterior poate fi văzut ca un singur sistem de calcul.
Există mai multe tipuri de clustere:
High-availability-cluster (HA) – au ca scop îmbunătățirea disponibilității serviciilor oferite;
Load-balancing-cluster (LB) – are loc în momentul în care mai multe sisteme de calcul împart sarcinile de lucru funcționând ca un singur sistem de calcul virtual.
Clustere pentru calcul (CC) – au rolul de a efectua calculele;
Caracteristicile serviciilor cluster:
Creșterea puterii de calcul în cadrul organizațiilor;
Gestionarea eficientă a datelor;
Utilizarea și gestionarea eficientă a resurselor (memorie RAM, procesoare, spațiu pe disc și lățime de bandă);
Asigurarea disponibilității serviciilor IT;
Viteza mare de transmitere a datelor;
Sisteme strâns cuplate (Tightly coupled systems);
Crează impresia unui singur sistem de calcul (Single system image);
Sistem centralizat de Job management și planificare.
În prezent clusterele sunt utilizate în special pentru disponibilitatea serviciilor web și baze de date, dar și în serviciile IaaS.
Un cluster se deosebește de Cloud și Grid prin faptul că un cluster reprezintă un grup de calculatoare conectate printr-o rețea locală LAN, spre deosebire de Cloud și Grid care fac parte dintr-o gamă largă. De asemenea Clusterele sunt formate din mașini hardware similare , în timp de Cloud și Grid sunt formate din configurații hardware foarte diferite.
Grid
Grid computing a fost utilizat pentru prima dată în anul 1998 și se referă la un set de servere care lucrează simultan la rezolvarea unui calcul masiv.
Importantele avantaje ale grid-ului sunt:
Disponibilitatea într-un număr mare de calculatoare conectate la internet oferind puterea de calcul necesară;
Limitarea costurilor cu ajutorul resurselor fizice necesare;
Utilizarea eficientă a resurselor de calcul;
Costurile scăzute , pot fi folosite diferite tipuri de echipamente;
Există și câteva diferențe , spre exemplu : calculatoarele care fac parte dintr-o rețea grid por rula sisteme de operare diferite și au hardware diferit, spre deosebire de calculatoarele dintr-un cluster au toate același hardware și același system de operare. Rețelele Grid sunt în mod inert distribuite într-o rețea LAN, WAN sau metropolitana. Pe de altă parte calculatoarele dintr-un cluster sunt în mod normal conținute int-un singur loc.
O altă diferență constă în modul în care sunt manipulate resursele. În cazul unui Cluster întregul sistem se comportă ca un sistem de virtualizare unică și resursele sunt gestionate de către managerul de resurse centralizate. În cazul unui Grid, fiecare nod este autonom adică are managerul de resurse propii și se comportă ca o entitate independent.
Caracteristicile principale grid:
Loosely coupled (Decentralization)
Diversitate și dinamism (datorită faptului că nu există control unic asupra tuturor sistemelor de calcul din grid)
Job Management și planificare distribuite.
Cloud computing
Cloud computing apare mai târziu în anul 2006/2007 ca o alternativă la cerințele companiilor în special pentru a sporii puterea de calcul.
Scopul principal al cloud-ului este utilizarea eficientă a resusrselor. Serviciile cloud sunt livrate prin intermediul internetului sub forma aplicațiilor specifice:SaaS , PaaS, IaaS.
Această metodă de interconectare se bazează pe conceptul software. Acest concept presupune închirierea serviciilor pentru o durată de timp determinată fără resurse hardware dedicate în scopul costurilor mai eficiente.
Principalele caracteristici ale cloud computing:
Flexibitate
Automatizare
Performanța
Disponibilitate
Securitate
Diferența dintre un Cloud și Grid o reprezintă:
Distribuția de resurse: Cloud computing este un model centralizat în timp de grid computing este un model descentralizat în cazul în care calculul poate avea loc peste mai multe domenii administrative.
Proprietatea: Grid reprezintă o colecție de calculatoare, care este formată din mai multe partiții și mai multe locații conectate împreună astfel încât utilizatorii pot partaja puterea resurselor.
1.3.7 Cele mai uzuale comenzi în sistemul de operare Linux
Sistemul de operare Linux conține un număr mare de aplicații destinate utilizării în linie de comandă. Fiecare aplicație poate primi parametrii și opțiuni, iar toate acestea fac învățarea comenzilor un obiectiv dificil, dacă nu imposibil. Astfel, este necesară cunoașterea modului de accesare al documentației fiecărei comenzi și interpretarea acesteia.
$ echo – afișează o linie de text
$ pwd – afișează numele directorului curent/de lucru
$ cd – schimbă directorul/locația de lucru
$ ls – listează conținutul directoarelor
$ ls – listează conținutul directorului curent
$ ls -a – listează conținutul directorului curent, inclusiv „.”, „..”, și directoarele/fișierele ascunse
$ ls -A – listează conținutul directorului curent și directoarele/fișierele ascunse
$ ls -l – afișează fișierele și directoarele locației curente într-un format extins
$ mkdir – creează un director
$ rmdir – șterge un director
$ mvdir – mută un director
$ rm – șterge fișiere și/sau directoare
$ rm -f – forțează îndeplinirea acțiunii, fără confirmarea utilizatorului, ignorând comenzile care pot surverni;
$ cp – realizează copierea unor fișiere
$ ln – creează link-uri (legături) între fișiere și directoare
$ cd – navighează către un director dat
$ cd. . – navighează cu un director înapoi
$ nano – editor text
$ wc -l – afișează numărul de linii dintr-un fișier
$ sudo – execută comanda cu drepturi de root
$ sudo su – alocă o consolă utilizatorului root, toate comenzile viitoare executate din acest punct vor fi executate cu privilegiile utilizatorului root
$ passwd – schimbă parola de acces
$ ifconfig – afișează configurația interfeței de rețea
$ ifconfig -a – afișează informațiile despre toate interfețele de rețea configurate în sistem
$ sudo iwconfig – afișează informații despre toate interfețele wireless
$ chmod – schimbă permisiunile de acces ale unui fișier
$ ping – folosește protocolul ICMP pentru a comunica cu un host
$ apt-get – caută și instalează pachete software
$ hostname – afișează și setează numele sistemului
$ help – afișează informații despre comanda specificată;
$ man – afișează pagini de manual despre comanda dorită
1.3.8 Atributele fișierelor
Tabelul 1.1: Atributele fișierelor
Comanda stat afișează informații despre:
momentul ultimei accesări: Access
momentul ultimei modificări a conținutului fișierului: Modify
momentul ultimei modificări asupra permisiunilor fișierului: Change
stat – afișează statusul unui fișier sau sistem de fișiere.
1.3.9 Permisiunile fișierelor
Permisiunile fișierelor controlează accesul utilizatorilor la fișierele și directoarele prezente pe sistem.
Pentru utilizatorul proprietar (user)
Pentru grupul proprietar de utilizatori (group)
Pentru alți utilizatori (others)
Figura 1.5 – Echivalența literal-numerică a permisiunilor unui fișier
Tabelul 1.2 – Corespondența numerică a permisiunilor de citire
Figura 1.3 Echivalența literal-numerică a permisiunilor cu comanda chmod
Schimbarea permisiunilor fișierelor se face cu comanda chmod.
Chmod modifică biții modului de acces al unui fișier.
Sintaxă:
chmod [OPTION]… MODE[,MODE]… FILE… – unde MODE este de forma [ugoa…][[–+=][perms…]…]
chmod [OPTION]… OCTAL-MODE FILE…
chmod [OPTION]… ––reference=RFILE FILE
1.3.10 Ierarhia sistemului de fișiere Linux. Organizarea fișierelor și directoarelor în Linux
Tabelul 1.4 Structura sistemului de fișiere
Capitolul 2
Sistemul proiectat si implementat are doua componente:
-subsistemul serverului care ruleaza serviciile de cloud OpenStack: aici au trebuit sa fie identificate elementele componente necesare a fi functiale cat si modul in care acestea vor fi accesate din exterior;
-subsistemul aplicatiei pentru monitorizarea serviciilor de cloud: aici a fost necesara proiectarea aplictiei si a modului in care aceasta transmite cererile autentificare catre serverul de cloud, cat si procesarea raspunsului primit in scopul salvarii si al afisarii in inerfata de utilizator.
Schema de functionare de mai jos identifica cele doua subsisteme si modul in care acestea interactioneaza.
Separat a trebuit sa fie proiectat si implementat accesu la componentele platformei de cloud.
Proiectarea subsistemului de cloud
Pentru aceasta etapa au fost analizate solutiile posibile de OpenStack care pot fi instalate. Scopul a fost identificarea unei soluții care sa poata fi usor de instalat si configurat ulterior in cadrul aplicatiilor de laborator.
Au fost identificate trei posibilitati:
DevStack – o versiune de OpenStack temporara, care nu funcioneaza decat pana la reponirea calculatorului. Pentru a preveni acest dezavantaj, a fost lansata intro masina virtuala VirtualBox, astfel incat sa fie posibila salvarea starii masinii virtuale, prin Snapshot, efectiv „inghetand” in timp configuratia. In acest tip de cloud OpenStack exista preconfigurate imagini de sistem de operare si tot traficul de retea catre masinile virtuale este autoconfigurat. Instalarea dureaza cateva zeci de minute in functie de viteza conexiunii la internet.
ConjureUp – o versiune permanenta de instalare OpenStack care foloseste containere LXC pentru instalare, avand nevoie de resurse importante pentru functionare. Instalarea s-a testat pe un sistem Quad Core cu 16 GB de memorie RAM si HDD SAS foarte rapid, iar procesul a durat aproximativ trei ore pana cand toate subsistemele au deveni functionale. In acest tip de cloud OpenStack nu exista preconfigurate imagini de sistem de operare (necesita descarcare de pe internet) si nu exista reguli de accesare a mașinilor componente din exterior (necesitând configurarea cu port forwarding).
TryStack – o versiune demo, online de OpenStack, in care se pot testa orice configuratii de cloud, limitata ca putere si functionalitate. Deoarece nu avem controlul asupra acestei solutii, partea de proiectare a vizat doar configuratia de retea si instantele rulate cat si posibilitatea folosirii acestei soluții drept material de test in laborator.
Concluzia este ca pentru o implementare rapida DevStack este recomandat, iar pentru o instalare permanenta ConjureUp. Pentru testele rapide in laborator TryStack este soluția care trebuie aleasa.
Sistemul de cloud pe care a fost testata aplicația este DevStack.
Proiectarea aplicației software
Aplicatia are rolul de a trimite cereri HTTP catre interfata web a OpenStack. In marea majoritate cererile necesita autentificare, din acest motiv sunt insotide de nume de utilixator si de parola.
OpenStack raspunde cererilor cu mesaje text in format JSON. In cazul in care cererile solicita efectuarea unor actiuni (creare de masini virtuale, stergere de retele, etc.) aceste actiuni sunt efectuate inainte de a trimite utilizatorului răspunsul.
Aplicația software va utiliza serviciile REST pentru a interoga platforma OpenStack.
Transferul de stat reprezentativ (REST) sau serviciile RESTful Web reprezintă o modalitate de a asigura interoperabilitatea între sistemele informatice de pe Internet. Serviciile Web compatibile cu REST permit sistemelor solicitante să accesese și să manipuleze reprezentările textuale ale resurselor Web utilizând un set uniform și predefinit de operațiuni de stat.
„Web resources” (resursele web) au fost definite pentru prima dată pe World Wide Web ca documente sau fișiere identificate prin adresele lor URL, dar astăzi au o definiție mult mai generică și abstractă care cuprinde toate lucrurile sau entitățile care pot fi identificate,numite,adresate sau manipulate, în orice fel pe Web. Într-un serviciu Web RESTful solicitările făcute către URL al unei resurse vor genera un răspuns care poate fi în: XML,HTML,JSON sau într-un alt format definit. Folosind HTML, fiind cel mai des întâlnit, operațiunile disponibile sunt date de verbele : HTTP GET, POST, PUT, DELETE.
Folosind un protocol de comunicare și operațiuni standard sistemele REST, au ca scop performanța, fiabiltatea și capacitatea de creștere rapidă prin reutilizarea componentelor care pot fi gestionate și actualizate fără a afecta sistemul.
Aplicația trebuie să transmită cereri către OpenStack și să citească răspunsurile primite. Răspunsurile în format JSON vor fi parcurse și interpretate folosind librăria JSON.NET. În final informațiile extrase sunt afișate pe ecran.
Fluxul de date este prezentat în figură următoare:
Figura 2.1 Fluxul de date
c
Pentru proiectarea interfetei cu utilizatorul a fost necesara urmarirea cerintelor aplicatiei, acelea de a putea fi introduce datele pentru realizarea cererii (GET/POST sau DELETE).
Tipul cererii a fost implementate printr-un control ComboBox care are o lista predefinita de valori. Campurile necesare de nume, parola si adresa IP au fost implementate prin elemente de tip TextBox.
Pentru câmpul de parola a fost introdus suplimentar un control Checkbox care sa gestioneze ascunderea sau nu a parolei cu simbolul steluta.
Următorul element introdus a fost o fereastra text in care difereitele nesaje care apar in urma interogarilor sa poata fi afisate in scopul consultarii de catre utilizator. S-a folosit un TextBox protejat la scriere ca fiind Read Only.
Informațiile primite drept răspuns sunt in format JSON. Pentru a putea afișa acest format a fost necesara realizarea unei structuri arborescente. Aceasta este găsita in interfața grafica a .NET prin controlul TreeView.
Pentru acest element a fost creta o funcție recursiva (se auto apelează) pentru a parcurge toate elementele JSON-ului inclusiv sub elementele acestora.
Obiectele JSON sunt de forma:
{“element JProperty” : “element JValue”}
Clasa JToken implementeaza metoda parse are permite identificarea tipului variabilei sin stringul JSON. Exemplu:
JToken t1 = JToken.Parse("{}"); //identificat drept obiect
JToken t2 = JToken.Parse("[]"); //identificat drept vector
JToken t4 = JToken.Parse("'A string!'");//identificat drept string
Dupa cum se observa in figura pentru inceput functia încearcă convertirea (parsarea) unui obiect primit drept parametru, intr-un obiect de tip JSON cu ajutorul functiei JToken din librăria JSON.NET.
Daca este JToken si primul element este identificat este JProperty in care primul element este de tipul JValue atunci acesta este un nod terminal. Acest element este adaugat la arborele TreeView ca fiind compus din concatenarea a doua parti Name si Value separate de „=>”. In cazul in care obiectul nu are valoare atasata, este adaugat simplu, fara „=>”. Prezenta acestui caracter permite ulterior afisarea distincta a celor doua elemente componente in interfata grafica.
Daca primul element nu este JValue, atunci este inceputul unui nou subarbore.
Parsarea este procesul prin care un obiect de un anumit tip este transformat intr-un obiect de un alt tip la momentul copierii acestuia intr-o variabila de un alt tip. In unele cazuri transformarea (conversia tipului variabilei) se poate realiza printr-un simplu cast adica se plaseaza noul tip intre doua paranteze, in acest mod fiind informat compilatorul ca dorim realizarea conversiei si cunoastem faptul ca pot sa fie pierderi de date.
Un exemplu este mai jos, in care conversia tipului din double (cu virgula) in numar intreg (fara zecimale) duce la pierderea de date:
double x = 10.3;
int a;
a = (int) x; //rezultatul este 10, valoarea dupa virgula fiind pierduta
In functia realizata conversia se realizează printr-un cast iar înainte este folosit operatorul is din C# pentru a verifica compatibilitatea dintre obiect si tipul dorit. Daca obiectul este JSON se returnează true, iar in caz contrar se returnează false.
Atunci cand se face dubu click pe o ramura a arborelui s-a implementat extragerea elementelor din TreeView este necesara deoarece utilizatorii pot dori folosirea informațiilor interogare. Afisarea cheii si a valorii se face in doua casute TextBox.
Pentru ca interogarile OpenStack produc structuri de dimensiuni mari, a fost proiectata si o functie de salvare a arborelui cat si o functie de incarcare a acestor date. In acest mod un utilizator poate consulta usor un arbore salvat anterior fara a fi necesara realizarea unei noi interogari.
Câteva elemente au fost proiectate si ulterior implementate, elemente care nu sunt vizibile utilizatului decat in momentul in care se incarca Form-ul.
Acest lucru a fost necesar datorita repetitivității introducerii acestor date (lucru care reducea viteza de testarea aplicației).
Au fost atașate evenimentelor de închidere si deschidere a Form-ului salvarea datelor interfeței grafice respectiv incarcarea acestora la pornirea aplicației.
3.3 Proiectare acces la componentele platformei
În mod normal un utilizator are acces la mașinile create pe platforma de virtualizare. Acesta nu ar trebui să aibă acces la interfața de administrare a mașinilor. Acest lucru se face de către administratori doar dintr-o rețea separată.
Pentru a da acces la serviciile interne ale sistemului de cloud, este necesară implementarea unor reguli de port forwarding, prin care traficul transmis pe anumite porturi este direcționat în rețeaua internă a platformei OpenStack, către mașina care se dorește a fi accesată.
3.3.1 Port forwarding
Port forwarding, de asemenea denumit " port mapping" se referă la procesul realizat de
gateway pentru schimbarea adresei de destinație.
intr-o retea privata.
Port forwarding poate fi folosit pentru a permite calculatoarelor la distanță (de exemplu,
masini publice pe Internet) să se conecteze la un anumit calculator dintr-o rețea privată, precum LocalArea Network(LAN), pentru a accesa serviciile furnizate de către gazde din rețeaua privată.
Iptables filtrează pachete in funcție de tipul pachetului pe care îl clasifică conform unor tabele predefinite. În total sunt trei tabele:
Mangle – este responsabil pentru modificarea biților de serviciu din antetul protocolului TCP.
Filter – este responsabil cu filtrarea pachetelor.
Nat – efectuează translatarea adreselor de retea (Network Address Translation – NAT).
Fiecare tabel poate avea cateva lanțuri implementate în care pot fi plasate normele de politică firewall.
Tabelul de filtrare are trei lanturi implementate:
Lanțul forward: filtrează pachete destinate rețelelor protejate de către firewall;
Lanțul input: filtrează pachete destinate pentru firewall;
Lanțul output: filtrează pachete care provin din firewall;
Tabelul NAT are implementate urmatoarele lanțuri:
Lanțul pre-routing: translatează adrese de rețea pentru pachete atunci cand adresa
destinație a pachetului necesită să fie schimbată;
Lanțul post-routing : translatează adrese de rețea pentru pachete atunci când adresa
sursă a pachetului necesită să fie schimbată;
Lanțul output : translatează adrese de rețea pentru pachete care provin din firewall;
Port forwarding folosind iptables
Această secțiune presupune ca deja ați setat un sistem Linux drept gateway și ați activat rutarea pe acesta.
Un pachet port-forwarded va trece lanțul PREROUTING în tabelul nat, lanțul FORWARD în tabelul de filtrare, lanțul POSTROUTING în tabelul nat și alte lanțuri. Trebuie să aplicăm anumite reguli acestor lanțuri.
Presupunem un exemplu pentru a introduce modul în care se configurează iptables pentru a realiza procedeul de port forwarding. Să presupunem că gateway-ul nostru se poate conecta atât la Internet (0.0.0.0/0) cât si la LAN (192.168.1.0/24). Interfața eth0 a PC-ului care actioneaza ca gateway are un IP public 9.10.11.12, în timp ce eth1 are un IP LAN 192.168.1.2. Acum, să presupunem că ne-am creat un server HTTP pe 192.168.11.12 și vrem să furnizăm servicii către Internet prin IP-ul public.
Mai jos se regaseste topologia retelei:
Internet––––––-[router/firewall]––––––––LAN
0.0.0.0/0 9.10.11.12 192.168.11.12 192.168.1.0/24
# iptables -A PREROUTING -t nat -i eth0 -p tcp -j DNAT –to 192.168.11.12:
# iptables -A FORWARD -p tcp -d 192.168.11.12 -j ACCEPT
În figură 3.14 este ilustrat modul în care un utilizator obișnuit poate accesa doar interfața externă a platformei OpenStack în vreme ce pentru un administrator sunt deschise porturile externe (în acest caz portul 700), astfel încât orice cerere adresată către portul extern va fi trimisă automat (forward) către portul 1300 din rețeaua internă. În cazul din figură calculatorul către care va fi direcționat traficul este cel de Keystone (serviciul de autentificare).
Figura 3.14 Interfața externă a platformei
Alternativ, în cazul în care este necesară conectarea la mai multe porturi din rețeaua internă (dar nu se știe exact care porturi) se pot asocia interfeței externe și alte adrese IP (acestea se numesc alias) iar tot traficul destinat unui IP extern să fie redirecționat către un anumit IP intern.
Figura 3.15 Interfața internă a platformei
Dezavantajul acestei abordări este „risipa” de adrese IP, având în vedere că sunt aproximativ 20 de servicii în rețeaua privată care pot fi accesate. Totodată deschiderea tuturor porturilor poate constitui o breșa de securitate.
Avantajul principal este ușurința configurării și faptul că în cazul în care este necesară accesarea unor noi porturi pentru unul dintre servicii, nu mai este necesară adăugarea de reguli noi la firewall.
Capitolul 3
Implementarea interfeței grafice
HTTP (Hypertext Transfer Protocol) este metoda cea mai des utilizată pentru accesarea informațiilor în Internet care sunt păstrate pe servere World Wide Web (WWW). HTTP oferă o tehnică de comunicare prin care informatiile (accesate si localizate prin link-uri numite Uniform Resource Identifier, practic o secvența de caractere ce permite identificarea unei resurse) se pot transmite de la un server aflat la distanță pe propriul computer. Metodele disponibile sunt :
GET: este cea mai folosită metodă, fiind utilizată atunci când serverului i se cere o resursă.
PUT: metoda este folosită pentru a depune documente pe server, fiind inversul metodei GET.
HEAD: se comportă exact ca metoda GET, dar serverul returnează doar antetul resursei, ceea ce permite clientului să inspecteze antetul resursei, fără a fi nevoit să obțină și corpul resursei.
POST: a fost proiectată pentru a trimite date de intrare către server.
DELETE: este opusul metodei PUT.
OPTIONS: este folosită pentru identificarea capacităților serverului Web, înainte de a face o cerere.
OpenStack permite cereri de tipurile GET, POST si DELETE. In figura următoare se observa rezultatul unei interogări de tip POST catre OpenStack. In continuare voi prezenta modul in care au fost implementate componentele aplicație.
Interfata grafica a fost proiectata pentru o dimensiune fixa, din acest motiv dimensiunea maxima si minima a ferestrei au fost definite ca fiind egale. In acest mod este imposibila redimenstionarea interfetei cu utilizatorul.
Pentru început au fost implementate casutele textbox in care utilizatorul poate introduce numele, parola, funcția OpenStack care va fi interogata si adresa IP a serverului OpenStack.
Daca la inceput lista care permite alegerea tipului functiei HTTP era liber selectata de catre utilizator (optiunile fiind POST, GET sau DELETE), aceasta a trebuit sa fie transformata in asa fel incat sa nu poata fi facute modificari de catre utilizator. Motivul a fost ca in cazul unui numar mare de functii ale OpenStack, este greu de amintit care este tipul corect pentru o anumita functie. Introducere unui tip gresit pentru o functie face ca interogarea sa esueze.
Acest lucru s-a realizat prin trasformarea ei din DropDown in DropDownList.
Pentru a accesa o functie OpenStack este necesara accesare unui URI. Acesta este compus din adresa IP a platformei OpenStack si numele functiei care se foreste a fi accesata. Practic un string este luat din casuta textbox de adresa IP iar celalalt din lista de functii API.
"http://" + textBox2.Text + listBox1.SelectedItem.ToString()
Rezultatul este: „http://192.168.100.10/identity/v2.0/tokens”
In momentul in care utilizatorul doreste sa faca o interogare, se parcurg urmatoarele etape:
Pentru început se verifica daca câmpurile necesare sunt completate (nume de utilizator, parola, adresa IP).
Verificarea daca o casuta TextBox este goala se face in felul urmator:
if (textBox2.Text != "")
Verificarea daca o selectie este efectuata intr-un ListBox se face ca mai jos si in cazul in care nu este realizata o selectie de catre utilizator (valoarea selectiei este -1 in acest caz) se realizeaza automat selectarea primei valori (selectia din lista cu indexul 0):
if (listBox1.SelectedIndex == -1) listBox1.SelectedIndex = 0;
Se compune in continuare stringul care va fi folosit in cererea web prin concatenarea stringurilor predefinite cu datele introduse de utilizator:
http://" + textBox2.Text + listBox1.SelectedItem.ToString()
Se compune cererea web de tipul HttpWebRequest care va fi trimisa la serverul OpenStack. In aceasta cerere trebuie precizat tipul acesteia (GET sau POST) si tipul continutului. In implementarea realizata a fost folosit mereu tipul JSON ("application/json").
var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://" + textBox2.Text + listBox1.SelectedItem.ToString());
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";
Se compune continutul cererii catre destinatie drept un string in format JSON care, in funcite de interogare poate contine datele de conectarea ale utilizatorului sau cheia de autentificare catre server. Exemplul urmator este formatul JSON pentru o cerere de obtinere a unei chei de la server pentru autentificare. Aceasta este valabila doar o ora si permite realizarea interogarilor fara a mai introduce numele de utilizator si parola in fiecare cerere ( acest lucru reprezentand o posibila prolema de securitate a sistemului).
Se observa câmpurile componente ale JSNO-ului care au o structura arborescenta:
Auth cu subcomponentele:
tenantName
passwordCredentials cu subcomponentele:
username
password
string json = "{\"auth\": {\"tenantName\": \"admin\", \"passwordCredentials\": {\"username\": \"admin\", \"password\": \"nomoresecret\"}}}";
Se creează un flux de tipul StreamWriter prin care se va scrie in conexiunea deschisa catre server. Conexiunea la server este identificata de httpWebRequest.GetRequestStream().
A fost folosit cuvantul cheie using pentru a izola o zona de cod in scopul limitarii cantitatii de memorie utilizate prin eliberarea resurselor utilizate in momentul in care executia programului a parasit zona delimitata de using. Orice variabila fulosita in zona using, elibereaza imediat memoria la terminarea acelei secvente de cod. Daca using nu era folosit, resursele utiliate ramaneau in memoria sistemului chiar daca nu mai erau folosite pana cand actiona eliberare automata a resurselor de catre .NET, deci nu instantaneu.
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
string json = "{\"auth\": {\"tenantName\": \"admin\", \"passwordCredentials\": {\"username\": \"admin\", \"password\": \"nomoresecret\"}}}";
streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
}
Fluxul de date de tip StreamWriter nu este scris instantaneu in conexiunea catre server la mometul accesarii functiei Write(). Pentru a forta aceasta scriere se apeleaza metoda Flush(). Dupa apelarea functiei Flush() bufferul este golit insa conexiunia cu serverul ramane deschisa (daca se doreste transmiterea de date suplimentare de exemplu). Daca bufferul nu se goleste la un moment dat, este posibil ca memoria sa se umple cu datele care urmeaza a fi scrise, iar operatia de scriere sa esueze din lipsa de resurse (memorie).
Fig. 1 Datele care intra in buffer sunt scrise in streamul de iesire la apelare Flush() insa streamul nu este inchis si permite scrierea de noi date
In final fluxul StreamWriter se inchide prin apelarea metodei Close().
O secvența de cod alternativa pentru using ar fi cea in care se folosește un try/catch/finally in care in zona finala de execuție se apelează funcția Dispose(). In exemplul de mai jos cele doua blocuri de cod sunt echivalente însa cel care folosește using este mai ușor de scris si reținut.
Caracterul \ plasat intr-un string ete un caracter care permite introducerea de elemente speciale care in mod normal nu ar putea fi introduse. In exemplu am introdus in string caracterul " care ar termina string-ul in cazul in care ar fi introdus direct. Caracterul shash plasat anterior \" arata faptul ca acel caracter trebuie trata ca o parte din string nu ca un terminator.
In continuare se deschide raspunsul in format HttpWebResponse:
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
Informatia este citita folosind clasa StreamReader. Conexiunea la server este identificata de httpResponse.GetResponseStream():
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
…
}
Se citeste raspunsul primit si se afiseaza informatia in interfata de log a aplicatiei.
var result = streamReader.ReadToEnd();
textBox1.AppendText(result);
Informația primita de la server este procesata in JSON.NET, o librărie care permite parcurgerea ușoara a stringurilor in format JSON, atât pentru extragerea conținutului (deserializare) cat si pentru crearea conținutului (serializare). Se proceseaza informatia din raspuns intr-o functie recursiva TraversareObiectJSON pentru a extrage toate subelementele JSON-ului pimit de la server. Infomatia este concatenta intr-un element de tip TreeView.
Pentru inceput se initializeaza nodul radacina
TreeNode valRadacina = treeView1.Nodes.Add("Rezultat");
In continuare se incearca prima interpretarea a raspunsului primit, iar daca aceasta reuseste, se apeleaza functia recursiva cu doi parametric: obiectul JSON si arborele la care trebuie adaugate elementele.
JToken token = JToken.Parse(rezultat);
TraversareObiectJSON(token, valRadacina);
In cazul in care parsarea nu reuseste exista un catch plasat care prinde erorile si afiseaza un mesaj de eroare.
In final toate elementele din JSON sunt atasate la arborele TreeView.
Fiecarui element din treeview i se asociza o functie pentru evenimentul de dublu click pentru a extrage informatia (nume si valoare) si a o plasa in caste textbox separate, pentru a putea sa fie preluata de catre utilizator cu COPY/PASTE.
Functia are rolul de a citi elementul din arbore pe care s-a dat click:
TreeNode node = treeView1.SelectedNode;
a extrage textul acestui nod al arborelui, si a-l spera in elemetnele componente (in functia recursiva s-au folosit drept separator caracterele „= >”) prin functia Split. Optiunea StringSplitOptions.RemoveEmptyEntries elimina componentele goale (string-ul „”) care ar rezulta in urma unuei operatii Split:
string[] stringSeparators = new string[] { "=>" };
string[] rez = node.Text.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries);
si in final pentru a plasa in caste textbox separate cele doua elemente de tip string obtinute. In cazul in care se obtine in urma unui Split un singur element, aecsta este numele iar valoarea este automat string-ul gol „”. Pentru a vedea cate elemente sunt obtinute se testeza lungimea vectorului de string-uri rezultat:
if (rez.Length == 1)
{
textBox3.Text = node.Text;
textBox4.Text = ""; //nu are valoare
}
else
{
textBox3.Text = rez[0];
textBox4.Text = rez[1]; //nu are valoare
}
Implementare functie recursiva TraversareObiectJSON
Obtinere tip variabila
In momentul in care răspunsul sosește de la serverul OpenStack, el are forma unui string. Acest string trebuie interpretat / transformat in format JSON pentru a putea fi procesat cu ajutorul librăriei JSON.NET. Exista mai multe posibilități pentru a realiza acest lucru:
Folosirea typeof care primeste drept parametru un nume care este specificat la momentul compilarii aplicatiei.
Exemplu:
Type t = typeof (element1);
if (t == typeof(int)){
// codul aplicatiei
}
Folosirea GetType care citeste tipul variabilei la momentul executiei codului
Exemplu:
if (element1.GetType() == typeof(int)) {
// codul aplicatiei
}
Folosirea is care returneaza adevarat in cazul in care variabila este de tipul respective sa false in cazul in care nu este de acel tip
Exemplu:
if (element1 is int) {
// codul aplicatiei
}
Folosirea as care daca nu reuseste initializarea tipului variabilei returneaza null, iar ni cazul in care initializarea este reusita, returneaza obiectul de tipul dorit.
Exemplu:
Type rezultat = element1 as Type;
if (rezultat!= null){
//codul aplicatiei
}
In cazul de fata transformarea se face prin cast astfel: (JProperty)token , iar implementarea functiei se face in modul următor:
private void TraversareObiectJSON(JToken token, TreeNode nodArbore)
{
if (token is JProperty)
if (token.First is JValue)
nodArbore.Nodes.Add(((JProperty)token).Name + "=>" + ((JProperty)token).Value);
else
nodArbore = nodArbore.Nodes.Add(((JProperty)token).Name);
foreach (JToken tk in token.Children())
TraversareObiectJSON(tk, nodArbore);
}
Practic initial testam daca obiectul este de tipul JProperty. Daca este, testam daca primul element din obiect (accesat prin funcția First() ) este o valoare adică este de tipul JValue. Daca este de acel tip inseamna ca avem perechea completa nume si valoare, care poate fi adaugate la arbore. Daca nu, si este tot o valoare de tipul JValue inseamna ca avem inceputul unui nou obiect de tipul JProperty, iar acesta trebuie atasat la arbore corespunzator. Obiecte de tip string astfel rezultate sunt adaugate la nodurile arborelui cu functia:.Nodes.Add(…)
Exemplu de JProperty pentru care urmatorul element este tot JProperty. Al doilea JProperty este marcat cu bold si este compus la randul sau din mai multe elemente.
{"endpoints": [{"region": "RegionOne", "publicURL": "http://192.168.100.10/compute/v2/dfc3df96c6e74ef5bb1cf1ed86721ed0", "id": "df197a2aec2c4a39a49db0cd94a0e38a"}]
Exemplu de JProperty cu JValue gol [].
"endpoints_links": []
Exemplu de JProperty cu JValue
"is_admin": 0
Pentru atasare nume, si marcare drept incepului unei ramuri a arborelui:
nodArbore = nodArbore.Nodes.Add(((JProperty)token).Name);
Pentru atasare nume si o valoare:
nodArbore.Nodes.Add(((JProperty)token).Name + "=>" + ((JProperty)token).Value);
Componentele nume si valoare sunt concatenate avand drept separator "=>" pentru a putea fi ulterior extrase din arbore in mod separat.
Salvarea arborelui intr-un fisier
Pentru a deschide un fisier se foloseste File.Open avand drept parametri numele fisirului si optiunea de a crea fisierul daca nu exista (FileMode.Create). Fisierul este deschis ca un flux de date Stream. Pentru a scrie intr-un fisier se foloseste clasa BinaryFormatter care permite serializarea automata a unor structuri complexe, in acest caz cea de TreeView. Metoda ToList() permite organizarea arborelui intr-o structura de tip lista, necesara drept parametru la functia Serialize.
Using (Stream fisier = File.Open(numefisier, FileMode.Create))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fisier, tree.Nodes.Cast<TreeNode>().ToList());
}
Incarcarea arborelui dintr-un fisier
Pentru inceput se prezinta o fereastra de dialog OpenFileDialog.
Daca deschiderea ferestrei se finalizeaza cu selectarea unui fisier, identificata de apasarea butonului OK cu DialogResult.OK (este plasat un filtru txt astfel incat numai fisierele cu acea extensie pot fi selectate), se executa functia de citire a fisierului si incarcare a arborelui.
Daca utilizatorul inchide fereastra de selectie a fisierului, atunci nu se mai executa incarcarea arborelui.
OpenFileDialog ofd = new OpenFileDialog();
ofd.Title = "Incarcare arbore";
ofd.Filter = "Text files|*.txt";
ofd.InitialDirectory = @"C:\";
if (ofd.ShowDialog() == DialogResult.OK)
{
IncarcareArbore(treeView1, ofd.FileName);
}
Incarcarea arborelui se face tot prin deschiderea fisierului selectat cu File.Open. Se deschide fluxul Stream si se citeste informatia. De data aceasta informatia este deserializata cu metoda inversa serializarii, si anume Deserialize a clasei BinaryFormatter.
using (Stream fisier = File.Open(numefisier, FileMode.Open))
{
BinaryFormatter bf = new BinaryFormatter();
object obj = bf.Deserialize(fisier);
Nodurile incarcate sunt in final adaugate la arbore cu functia:
tree.Nodes.AddRange(listaNoduri);
Salvarea preferintelor din interfata utrilizator
Aceasta functie este apelata automat la inchiderea aplicatiei (evenimetul Closing al obiectului Form). Se apeleaza metoda WriteAllLines din clasa File care permite scrierea listei de string-uri in fisier, fiecare string pe o linie.
string[] lines = { textBox5.Text, textBox6.Text, textBox2.Text };
System.IO.File.WriteAllLines("infomatii.txt", lines);
Incarcarea preferintelor din interfata utrilizator
Pentru inceput se verifica existenta fisierului din care se vor citi informatiile folsind Exists metoda din clasa File.
if (File.Exists("infomatii.txt"))
Daca acesta exista, se citesc toate liniile fisierului folosing functia ReadAllLines din clasa File.
Acum exista mai multe posibilitati in functie de cate campuri a completat utilizatorul. Numarul campurilor este determinat de numarul de valori din vectorul de elemente string, prin folsirea functiei Count().
Pe primul rand este informatia de user name, pe al doilea este parola si pe al treilea rand este adresa IP a serverului OpenStack.
if (File.Exists("infomatii.txt"))
{
string[] lines = System.IO.File.ReadAllLines("infomatii.txt");
//prima linie este user
if (lines.Count() > 0) textBox5.Text = lines[0];
//a doua linie e parola
if (lines.Count() > 1) textBox6.Text = lines[1];
//a treia linie e IP
if (lines.Count() > 2) textBox2.Text = lines[2];
}
2.3 TryStack
Există mai multe posibilitati pentru instalarea OpenStack: TryStack, DevStack, ConjureUp, AutoPilot;
TryStack este un proiect al Fundației OpenStack, ocupânduse cu partea politică a acestuia.Pentru a vedea cum funcționează OpenStack , TryStack este cea mai simplă și gratuită metodă.
Pentru a testa OpenStack în TryStack, trbuie să ne înregistrăm alaturande-ne la TryStack Facebook Group, accesând pagină web ‘trystack.org’. Acceptarea grupului se face manual și poate dura 2-3 zile.
Figura 2.3 Interfața web pentru acces TryStack
Figura 2.4 Conectare TryStack
După ce suntem acceptați în grup, ne putem autentifica cu ajutorul propriului cont de Facebook accesând: “Login with Facebook”.
După ce ne conectăm la TryStack avem acces la Compute Dashboard (tabloul de bord). Aici putem crea și executa instanțe.
Când realizăm diverse activități în TryStack spre exemplu: lansări instanțe, crarea volumelor cunsumam Stack Dollar, deasemenea acesta consumă în permanență în timp ce rulează. Stack Dollar este unitatea de măsură pentru TryStack. În momentul în care rămâi fără Stack Dollar (sau când nu îl mai rulezi) nu mai poți folosi serviciul TryStack , până când se încarcă sau se redeschide.Stack Dollar se va încărca periodic în funție de timpul pe care îl setăm. De asemenea, trebuie să știm că TryStack poate fi folosit doar pentru teste, nu pentru alte circumstanțe.
Instalare instanță TryStack:
Figura 2.5 Lansare instanță în TryStack
Generare chei pentru conectare ssh:
Pornim utilitarul „PuTTYgen”;
Pentru „Type of key to generate”, selectam SSH-2 RSA;
Pentru câmpul: „Number of bits in a generate key” specificăm fie 2048, fie 4096;
Apăsăm butonul : „Generate”;
Figura 2.6 Generarea chei pentru conectarea ssh
Cheia genarată va fi :
ssh-rsa
AAAAB3NzaC1yc2EAAAABJQAAAQEAzPwyMrb9uEtp99/8DVvhP3pT99+keSZ7IGLs5YWYbvi3YksL5N4RUKLKwdBTpvhU7OQx8JFPYimI85jqsdY6lOSdW6qZ0Wp0WU6AHeiOKBIRcGQxOdJHR+aHuICjsjNoyPrEeyVQUEpHsmV80ra9DddGbEyt7yBDXp/ktRbobktQD/ObbDdETjv0KTDCg2+Jt6e2wN7rco67THeD18vKeEHFmxmQz/qmjfKZLK3KVYLGfvNAQWtVfe7/NiX8w0CPCiiF+KUkKbmtBKl9RqMu42FtQ4EIg3KuORXyCuPI8GhaFTG+wMNK1whq6f+1FGdxNhq3qTKQkf7dfC1v8MTs4Q== rsa-key-20170621
ssh-rsa 2048 8f:da:cc:e5:f1:0f:11:1a:72:9c:64:d8:ca:1d:ff:f4
rsa-key-20170621
Figura 2.7 Cheia generată cu ajutorul “Putty Key Generator”
Conectare la cirros:
Figura 2.8 Conectare la cirros
Figura 2.9 Conectare instanță TryStack
Figura 2.10 Informații instanță creată
Figura 2.11 Tablou de bord TryStack
Figura 2.12 Lista mașinilor virtuale existente
Figura 2.13 Consola instanței create in TryStack
2.4 OpenStack Autopilot
OpenStack Autopilot reprezintă cea mai ușoară instalare dinamică OpenStack din lume. Aceasta se ocupă de toate aspectele cloud pe mai multe mașini fizice prin instalare, extindere și operațiuni de zi cu zi.
Cerințe pentru îndeplinirea instalării OpenStack Autopilot:
Minim șase mașini cu două discuri (o mașină pentru serverul MAAS, a doua mașină pentru JUJU controller, a treia mașină pentru OpenStack Autopilot și minim alte 3 mașini pentru cloud)
O mașină cu două interfețe de rețea
Un swith dedicat pentru a crea un cloud private LAN
Acces la internet printr-un router LAN
După configurarea celor șase mașini virtuale, trebuie instalat Ubuntu Server pe una dintre acestea.
Utilizăm MAAS pentru înregistrarea mașinilor virtuale.
2.5 Conjure up
Deoarece platforma OpenStack are foarte multe componente, în majoritatea cazurilor se recomandă instalarea acestora pe mașini fizice separate și interconectarea acestora printr-o rețea foarte rapidă (de cel puțin 1Gbps). Figura următoare prezintă componentele OpenStack rulând și interconexiunile dintre componente.
Figura 2.2 Interconexiunile dintre componentele OpenStack
Testarea Openstack pe un PC folosind una dintre cele mai rapide și interactive metode disponibile: Conjure-up.
Conjure-up implementat cu LXD și Juju Charms;
Pentru instalare avem nevoie de:
un server Ubuntu 16.04;
16 GB RAM;
un processor multi-core;
spațiu disponibil SSD(în funcție de numărul de noduri (compute nodes) de calcul dorite ).
După instalare vom folosii următoarele comenzi:
$ sudo apt update && sudo apt upgrade && sudo apt dist-upgrade
$ reboot
Comenzile următoare sunt folosite pentru instalarea automată a: “conjure-up” și “openstack” :
$ sudo apt get remove conjure-up juju
$ sudo snap install conjure-up –classic
$ sudo apt install conjure-up –classic
$ sudo apt update && sudo apt get upgrade
$ reboot
$ conjure-up openstack
Instalarea va dura aproximativ 25-30 minute. În timpul instalării am deschis un terminal nou pentru a vedea containerele care rulează și adresele lor IP;
Pentru acest lucru am folosit comanda:
$ lxc list
Când instalarea este terminată va trebui introdus numele de utilizator și parola.
La final putem monitoriza starea folosind oricare dintre comenzile:
$ juju gui
$ juju status
$ ip/horizon
3.5 Implementarea interfeței grafice
În figura urmatoare se observă rezultatul unei interogări de tip POST către OpenStack. In continuare voi prezenta modul in care au fost implementate componentele aplicație.
Figura 3.18 rezultatul interogării OpenStack
Interfața grafică a fost proiectată pentru o dimensiune fixă, din acest motiv dimensiunea maximă și minimă a ferestrei au fost definite ca fiind egale. În acest mod este imposibilă redimenstionarea interfeței cu utilizatorul.
Figura 3.19 Dimensiunea interfeței grafice
Lista de opțiuni a trebuit să fie transformată în așa fel încât să nu poată fi făcute modificări de către utilizator. Acest lucru s-a realizat prin trasformarea ei din DropDown în DropDownList.
Figura 3.20 Lista opțiunilor (DropDown/DropDownList)
Pentru prcesare informatiei in format JSON s-a utilizat libraria JSN.NET. Aceasta a fost instlat in solutia din Visual Studio astfel
Figura 3.16 Instalare JSON în VisualStudio
Figura 3.17 Instalare JSON în VisualStudio
In final se includ in program librariile
using Newtonsoft.Json;
3.6 Obținere tip variabilă
În momentul în care răspunsul sosește de la serverul OpenStack, el are forma unui string. Acest string trebuie interpretat / transformat în format JSON pentru a putea fi procesat cu ajutorul librăriei JSON.NET. Exista mai multe posibilități pentru a realiza acest lucru:
Folosirea typeof care primeste drept parametru un nume care este specificat la momentul compilarii aplicației.
Exemplu:
Type t = typeof (element1);
if (t == typeof(int)){
// codul aplicației
}
Folosirea GetType care citește tipul variabilei la momentul execuției codului
Exemplu:
if (element1.GetType() == typeof(int)) {
// codul aplicației
}
Folosirea is care returnează adevărat în cazul în care variabila este de tipul true respective false in cazul în care nu este de acel tip
Exemplu:
if (element1 is int) {
// codul aplicației
}
Folosirea as care dacă nu reușește inițializarea tipului variabilei returnează null, iar în cazul în care inițializarea este reușită, returnează obiectul de tipul dorit.
Exemplu:
Type rezultat = element1 as Type;
if (rezultat!= null){
codul aplicației
}
Capitolul 4
4.1 Testarea aplicației
DevStack
DevStack este o metodă mai rapidă prin care putem creea un mediu de dezvoltare OpenStack.
Observație: Acest mediu DevStack nu este unul persistent, utilizatorul are ca scop pregătirea unui mediu de dezvoltare într-un timp foarte scurt ce facilitează tuturor utilizatorilor posibilitatea de a interacționa cu OpenStack. Această metodă nu este destinată pentru pregătirea unui mediu de producție.
Resurse necesare:
Pentru instalarea DevStack avem nevoie de o mașină virtuală (VirtualBox), și un sistem de operare, în cazul nostru (Ubuntu 16.04.2).
Figura 4.1 Crearea unei mașini virtuale
Figura 4.2 Instalare Ubuntu 16.4.02
Se vor folosii următoarele comenzi pentru instalare:
$ sudo rm –rf /var/lib/apt/lists/*
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
$ sudo reboot
$ sudo apt-get install git
$ git clone https://github.com/openstack-dev/devstack.git
$ cd devstack
$ wget -O localrc http://goo.gl/OeOGqL
$ ./stack.sh
Aici vom întampina o eroare:
Figura 4.3 Nu s-a putut determina adressa de IP
Am rulat comanda: nano localrc , am introdus ip-ul: HOST_IP=10.0.2.15
Acum rulăm: ./stack.sh
Următoarea eroare:
Figura 4.4 Nu poate accesa opt/stack/keystone
Rulăm comanda: git clone git://git.openstack.org/openstack/keystone.git /opt/stack/keystone
Repetăm instalarea: ./stack.sh
Următoarea eroare:
Figura 4.5 Nu a putut accesa /opt/stack/glance
Rulăm comanda:
git clone git://git.openstack.org/openstack/glance.git /opt/stack/glance
repetăm instalarea: ./stack.sh
Următoarea eroare:
Figura 4.6 Nu a putut accesa /opt/stack/neutron
Următoarea comandă:
git clone git://git.openstack.org/openstack/neutron.git /opt/stack/neutron
repetăm instalarea: ./stack.sh
Următoarea eroare:
Figura 4.7 Nu a putut accesa /opt/stack/nova
Urmatoarea comanda:
git clone git://git.openstack.org/openstack/nova.git /opt/stack/nova
repetăm: ./stack.sh
Următoarea eroare:
Figura 4.8 Nu a putut accesa /opt/stack/horizon
Introducem comanda: git clone git://git.openstack.org/openstack/horizon.git /opt/stack/horizon
Rulăm: ./stack.sh
Figura 4.10 Finalizarea instalării DevStack
Mai departe ne putem conecta la o interfată web accesând link-ul: http://localhost/ folosind user-ul si parola afișată în consola: User – admin/demo , parolă: openstack.
Daca interfata de retea nu mai raspunde se folosesc comenzile
ifdown numeinterfata
ifup numeinterfata
Utile pentru verificarea fitrelor de retea si pentru a verifica IP forwarding:
iptables –L
iptables –t nat –L
Exemple de interogare si raspuns
1.a. Obtinere token (un token este functional pentru o ora):
valeriu@ubuntu:~$ curl -i -X POST http://10.0.8.155:5000/v2.0/tokens -H "Content-Type: application/json" -H "User-Agent: python-keystoneclient" -d '{"auth": {"tenantName": "admin", "passwordCredentials": {"username": "admin", "password": "openstack"}}}'
Raspuns:
HTTP/1.1 200 OK
Date: Sun, 18 Jun 2017 19:27:43 GMT
Server: Apache/2.4.18 (Ubuntu)
Vary: X-Auth-Token
X-Distribution: Ubuntu
x-openstack-request-id: req-4b8ef6f1-1639-4830-ac43-997a4d1a6e91
Content-Length: 2047
Content-Type: application/json
{"access": {"token": {"issued_at": "2017-06-18T19:27:45.000000Z", "expires": "2017-06-18T20:27:45Z", "id": "bf47ac250ed145bbb265ba29edcb76ce", "tenant": {"description": "Created by Juju", "enabled": true, "id": "319448cdc2214848a5af288b152f8a11", "name": "admin"}, "audit_ids": ["_4EwOjQ_TgiSIzDjA2jZvw"]}, "serviceCatalog": [{"endpoints": [{"adminURL": "http://10.0.8.141:80/swift", "region": "RegionOne", "internalURL": "http://10.0.8.141:80/swift/v1", "id": "304bfcbebbb345aabe994d4b4b583cad", "publicURL": "http://10.0.8.141:80/swift/v1"}], "endpoints_links": [], "type": "object-store", "name": "swift"}, {"endpoints": [{"adminURL": "http://10.0.8.13:9292", "region": "RegionOne", "internalURL": "http://10.0.8.13:9292", "id": "31d74b3e652e48a9aa7f1ca9bcc0559c", "publicURL": "http://10.0.8.13:9292"}], "endpoints_links": [], "type": "image", "name": "glance"}, {"endpoints": [{"adminURL": "http://10.0.8.35:8774/v2/319448cdc2214848a5af288b152f8a11", "region": "RegionOne", "internalURL": "http://10.0.8.35:8774/v2/319448cdc2214848a5af288b152f8a11", "id": "52934d550bdc483e838bb068e0e48119", "publicURL": "http://10.0.8.35:8774/v2/319448cdc2214848a5af288b152f8a11"}], "endpoints_links": [], "type": "compute", "name": "nova"}, {"endpoints": [{"adminURL": "http://10.0.8.17:9696", "region": "RegionOne", "internalURL": "http://10.0.8.17:9696", "id": "a3c8c2ea33074ff583567346cab1cbb0", "publicURL": "http://10.0.8.17:9696"}], "endpoints_links": [], "type": "network", "name": "neutron"}, {"endpoints": [{"adminURL": "http://10.0.8.155:35357/v2.0", "region": "RegionOne", "internalURL": "http://10.0.8.155:5000/v2.0", "id": "a901677f8b5d471cb680e9f3366bdd67", "publicURL": "http://10.0.8.155:5000/v2.0"}], "endpoints_links": [], "type": "identity", "name": "keystone"}], "user": {"username": "admin", "roles_links": [], "id": "0abed39d8d224176ae2e0094d1d383da", "roles": [{"name": "Admin"}, {"name": "_member_"}], "name": "admin"}, "metadata": {"is_admin": 0, "roles": ["713a2b80f1e54ce8b8b17465a59229dc", "9fe2ff9ee4384b1894a90878d3e92bab"]}}}
1.b. salvare token pentru utilizare usoara in alte interogari:
TOKEN= bf47ac250ed145bbb265ba29edcb76ce
2. Listare imagini cu sitemele de operare
curl -s -X GET -H "X-Auth-Token:$TOKEN" -H 'Content-Type: application/json' -H 'User-Agent: python-glanceclient' http://10.0.8.155:9292/v1/images/detail?sort_key=name&sort_dir=asc&limit=20
Raspuns:
[1] 70666
[2] 70667
3. Listarea tuturor masinilor virtuale
valeriu@ubuntu:~$ curl -s 'http://10.0.8.35:8774/v1.1/02ef892087a640bcb66bd42a3ceccc79/servers/detail' -X GET -H "X-Auth-Project-Id: demo" -H "User-Agent: python-novaclient" -H "Accept: application/json" -H "X-Auth-Token:$TOKEN"
Raspuns:
{"choices": [{"status": "SUPPORTED", "media-types": [{"base": "application/json", "type": "application/vnd.openstack.compute+json;version=2"}], "id": "v2.0", "links": [{"href": "http://10.0.8.35:8774/v2/v1.1/02ef892087a640bcb66bd42a3ceccc79/servers/detail", "rel": "self"}]}, {"status": "CURRENT", "media-types": [{"base": "application/json", "type": "application/vnd.openstack.compute+json;version=2.1"}], "id": "v2.1", "links": [{"href": "http://10.0.8.35:8774/v2.1/v1.1/02ef892087a640bcb66bd42a3ceccc79/servers/detail", "rel": "self"}]}]}
3.1 Implementarea aplicației
Figura 3.1 Creare rețelei pentru conectarea în sistemul de operare
Figura 3.2 Creare Network
Figura 3.3 Lansare instanță în GUI
Figura 3.4 Adaugare cirros
Figura 3.5 Alocarea dimensiunii de calcul
Figura 3.6 Alocarea unei rețea
Figura 3.7 Generarea unei perechi de chei pentru conectarea SSH la mașina creată
Figura 3.8 Instanța este generată
Figură 1 Instanța este generată
In final instanța este funcițonală și utilizatorii se pot conecta la ea.
Figura 3.9 Funcționalitatea instanței
Figură 2 Funcționalitatea instanței
Figura 3.10 Conectare cirros
Instanța are adresele Ip din gama de adrese configurată la momentul instalării.
Figura 3.11 Adresele IP
Capitolul 5
5.1 Concluzii
In acest proiect s-a implementat …
Se va instala și configura un sistem de cloud privat OpenStack care va fi folosit pentru a oferi sisteme de operare Linux pentru laboratorul T201.
Se va investiga necesarul hardware și software pentru implementarea unui laborator pentru servicii de cloud la disciplină Rețele Locale de Calculatoare.
Se va proiecta o aplicație în limbajul C# care să afle informații despre starea platformei OpenStack. Aplicația:
Va interoga de la distanță serviciile oferite de sistemul de cloud privat OpenStack folosind OpenStack web API;
Răspunsul primit, în format JSON, va fi procesat iar informațiile extrase vor fi afișate pe ecran.
Sistemul proiectat si implementat are doua componente:
-subsistemul serverului care ruleaza serviciile de cloud OpenStack: aici au trebuit sa fie identificate elementele componente necesare a fi functiale cat si modul in care acestea vor fi accesate din exterior;
-subsistemul aplicatiei pentru monitorizarea serviciilor de cloud: aici a fost necesara proiectarea aplictiei si a modului in care aceasta transmite cererile autentificare catre serverul de cloud, cat si procesarea raspunsului primit in scopul salvarii si al afisarii in inerfata de utilizator.
Anexe
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Acronime folosite: [304395] (ID: 304395)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
