Feature #183

Υλοποίηση RSAPI, /servers

Added by Vangelis Koukis about 13 years ago. Updated about 13 years ago.

Status:Closed Start date:01/27/2011
Priority:High Due date:
Assignee:Giorgos Verigakis % Done:

0%

Category:Cyclades API Spent time: -
Target version:-

Description

Υλοποίηση του RS API, μέρος /servers. Επικοινωνία με Ganeti πάνω από RAPI για πραγματοποίηση αλλαγών στην κατάσταση των μηχανών, χρήση Django ORM για επικοινωνία με ΒΔ.


Related issues

related to Synnefo - Feature #211: Error Handling Ganeti - API (Django) Closed 02/11/2011
related to Synnefo - Feature #253: Μετάβαση στο OpenStack Compute API v1.1 Closed 03/08/2011
related to Synnefo - Feature #179: RAPI calls, από την υλοποίηση του API προς το Ganeti Closed 01/25/2011
related to Synnefo - Bug #233: Χειρισμός λαθών στο Rackspace API Closed 02/28/2011
related to Synnefo - Bug #311: Διόρθωση του GUI ώστε να παίζει με OpenStack v1.1 Closed 03/23/2011 04/04/2011
related to Synnefo - Bug #301: Sanitization του API, αφαίρεση του Piston, έλεγχος συμμόρ... Closed 03/18/2011 04/06/2011
related to Synnefo - Bug #203: Ενημέρωση του χρήστη έπειτα από δημιουργία εικονικής μηχα... Closed 02/01/2011 03/25/2011
blocked by Synnefo - Feature #255: τρόπος επιστροφής των IP addresses στο API Closed 03/08/2011

Associated revisions

Revision d8e50a39
Added by Giorgos Verigakis about 13 years ago

Move to OpenStack API v1.1

  • Removes piston dependency.
  • Adds dateutil dependency.

Fixes #183 - Implement /servers
Fixes #185 - Implement /images
Fixes #245 - Details in exception handlers
Fixes #249 - Metadata handling
Fixes #253 - Transition to OpenStack API v1.1
Fixes #255 - Fix XML for addresses
Fixes #287 - Piston related bug
Fixes #289 - Support both XML and JSON
Fixes #309 - GUI not refreshing
Fixes #339 - Support API extensions
Fixes #359 - action returns serviceUnavailable
Fixes #361 - return dates with timezones
Refs #301 - Sanitization of API
Refs #315 - Replace API v1.1

History

#1 Updated by Markos Gogoulos about 13 years ago

  • Status changed from Assigned to Feedback

Το documentation έχει μπει στο κεφάλαιο Υλοποίηση του API στο http://trac.cslab.ece.ntua.gr:8081/cloud/wiki/DesignImplAPI

Μέσω του rapi μπορούμε και συνδεόμαστε στο ganeti cluster που υπάρχει στο 62.217.120.78 και μπορούμε να κάνουμε Create/Delete/Reboot/Shutdown Instances, να δούμε πληροφορίες για κάθε ένα απο αυτά ή να πάρουμε τη λίστα με τα instances.

#2 Updated by Markos Gogoulos about 13 years ago

Επίσης έχει γίνει η βασική διασύνδεση του ui με το RS API. Η jQuery.ajax στέλνει πλεον POST και DELETE methods τα οποία πιάνουν οι

  • api.handlers.ServerHandler.create για create machine
  • api.handlers.ServerActionHandler.create για shutdown machine
  • api.handlers.ServerActionHandler.create για reboot machine
  • api.handlers.ServerHandler.delete για destroy machine

(στο list view των machines μονο για την ωρα)

#3 Updated by Markos Gogoulos about 13 years ago

Ο κώδικας που υπάρχει σχετικά με τους handlers (api/handlers.py) έχει πολλά περιττά if όσον αφορά το rapi και τα Mock objects, που καλό θα ήταν να σβήσουμε ώστε να μην μας μπερδεύουν, και να τα αντικαταστήσουμε με μηνύματα λάθους (πχ "η σύνδεση με το rapi έχει πέσει").

Έτσι και δεν θα συντηρούμε κώδικα που δεν χρειάζεται αλλά και θα ξεχωρίσουμε την κάθε περίπτωση (που επιστρέφει δεδομένα το rapi και που η ΒΔ του Django.

Τι λέτε?

#4 Updated by Panagiotis Louridas about 13 years ago

Markos Gogoulos wrote:

Ο κώδικας που υπάρχει σχετικά με τους handlers (api/handlers.py) έχει πολλά περιττά if όσον αφορά το rapi και τα Mock objects, που καλό θα ήταν να σβήσουμε ώστε να μην μας μπερδεύουν, και να τα αντικαταστήσουμε με μηνύματα λάθους (πχ "η σύνδεση με το rapi έχει πέσει").

Έτσι και δεν θα συντηρούμε κώδικα που δεν χρειάζεται αλλά και θα ξεχωρίσουμε την κάθε περίπτωση (που επιστρέφει δεδομένα το rapi και που η ΒΔ του Django.

Τι λέτε?

Δίνεις ένα παράδειγμα τι εννοείς; Ή στείλε ένα patch όπως θα ήθελες να είναι, για να καταλάβουμε ακριβώς το θέμα;

#5 Updated by Markos Gogoulos about 13 years ago

πχ στο class ServerHandler, στη def read_all έχει το εξής:

if not rapi: # No ganeti backend. Return mock objects
....
else: # ganeti backend. return objects
....

προτεινω να ασχοληθούμε με το if rapi, και το if not rapi να βγάζει κάποιο μήνυμα οτι δεν υπάρχει σύνδεση με το ganeti ή κάτι τέτοιο...

#6 Updated by Panagiotis Louridas about 13 years ago

Markos Gogoulos wrote:

πχ στο class ServerHandler, στη def read_all έχει το εξής:

if not rapi:
  1. No ganeti backend. Return mock objects
    ....
    else:
  2. ganeti backend. return objects
    ....

προτεινω να ασχοληθούμε με το if rapi, και το if not rapi να βγάζει κάποιο μήνυμα οτι δεν υπάρχει σύνδεση με το ganeti ή κάτι τέτοιο...

Με αυτό απαντάς και στην απαίτηση για unit tests.

Συγκεκριμένα:

Κρατάς μόνο τον κώδικα για rapi.

Τον κώδικα χωρίς rapi τον μεταφέρεις σε unit tests τα οποία φτιάχνεις σύμφωνα με τις σχετικές οδηγίες.

Προσοχή, θέλουμε unit tests, όχι doc tests.

#7 Updated by Constantinos Venetsanopoulos about 13 years ago

  • Status changed from Feedback to Assigned
  • Priority changed from Medium to High

Όπως είπαμε χτές πρέπει να ανανεωθεί μετά τις τελευταίες αλλαγές στα μοντέλα, ώστε να γίνει πλήρως λειτουργικό.
Οι μέθοδοι του ServerHandler πρέπει να επεκταθούν ώστε να χρησιμοποιούν τα vm.start_action(), vm.rsapi_state. Επίσης:

- Η μέθοδος POST να διαλέγει τυχαίο password για το υπό κατασκευή μηχάνημα
- Η μέθοδος POST να δέχεται metadata τα οποία θα εισάγει στο VirtualMachineMetadata
- H μέθοδος GET να επιστρέφει μόνο όσα μηχανήματα δεν έχουν vm.rsapi_state="DELETED"

Για error handling δείτε το #211

#8 Updated by Vangelis Koukis about 13 years ago

Ενδεικτικά κάποια πράγματα που πρέπει κατ'ελάχιστο να γίνουν. Νομίζω υπάρχουν κι άλλα που θα βγουν μετά από μια πρώτη υλοποίηση:

α) Η υλοποίηση του GET για /servers να κοιτάει τη βάση, τώρα υπάρχει ακόμη κώδικας που κάνει RAPI calls εκεί
β) να μπουν όλα τα RAPI calls για reboot/shutdown/restart [εκεί υπάρχει θέμα και στο GUI]
γ) να παίξει το POST για create [εκεί θέλει αρκετά: τυχαίο password, λήψη metadata για το νέο server (βλ. API documentation), το GUI να του περνάει metadata αυτά που διαβάζει από το image)]
δ) Πλήρες documentation στον κώδικα για τα (α), (β), (γ)
ε) Χειρισμός προβληματικών καταστάσεων, επιστροφή λογικών κωδικών λαθών HTTP [βλ. #211]

#9 Updated by Vangelis Koukis about 13 years ago

Πλέον των παραπάνω, υπάρχουν ακόμη τα εξής bugs:

  • GET /servers/detail
    • το hostId δεν μπαίνει μέσα στα metadata αλλά απ'έξω
    • υπάρχει ένα "Server_Label" μέσα στα metadata
    • υπάρχει ένα "item" tag το οποίο πρέπει να φύγει
  • GET /servers/id
    • επιστρέφει τα πεδία του VirtualMachine model χωρίς καμία μετατροπή σε RS API

#10 Updated by Markos Gogoulos about 13 years ago

  • Status changed from Assigned to Feedback

Για το GET /servers/detail

το rackspace api επιστρεφει
<addresses>
<public>
<ip addr="67.23.10.132"/>
<ip addr="67.23.10.131"/>
</public>
<private>
<ip addr="10.176.42.16"/>
</private>
</addresses>

ενω εμεις επιστρεφουμε
<addresses>
<ip_six>
<ip addr="::1"/>
</ip_six>
<ip_four>
<ip addr="192.168.2.1"/>
</ip_four>
</addresses>

μιας και δεν εχουμε public/private αλλα ip_four και ip_six. Ειμαστε οκ με αυτο?
Όσον αφορα το metadata θελει περισσοτερη δουλεια, γιατι δεν καλυπτεται το σεναριο απο τον OSXMLEmitter emitter και θα χρειαστει επεκταση

(το api επιστρεφει κατι του στυλ)
<metadata>
<meta key="Server Label">Web Head 1</meta>
<meta key="Image Version">2.1</meta>
</metadata>

#11 Updated by Vangelis Koukis about 13 years ago

Markos Gogoulos wrote:

Για το GET /servers/detail

το rackspace api επιστρεφει
<addresses>
<public>
<ip addr="67.23.10.132"/>
<ip addr="67.23.10.131"/>
</public>
<private>
<ip addr="10.176.42.16"/>
</private>
</addresses>

ενω εμεις επιστρεφουμε
<addresses>
<ip_six>
<ip addr="::1"/>
</ip_six>
<ip_four>
<ip addr="192.168.2.1"/>
</ip_four>
</addresses>

μιας και δεν εχουμε public/private αλλα ip_four και ip_six. Ειμαστε οκ με αυτο?

Ας κρατήσουμε ακριβώς τα δικά τους tags και να προσθέσουμε ό,τι νέο χρειάζεται.
Ένας client που ρωτάει, να μπορεί να βρει αυτά που περιμένει. Οπότε, κάνε την απάντηση:

<addresses>
  <public>
    <ip addr="192.168.2.1"/>    
    <ip6 addr="::1"/>
  </public>
  <private>
  </private>
</addresses>

Ώστε να υπάρχει κανονικά η προβλεπόμενη διάκριση public/private, να υπάρχει public/ip και να υπάρχει και public/ip6 tag.

Όσον αφορα το metadata θελει περισσοτερη δουλεια, γιατι δεν καλυπτεται το σεναριο απο τον OSXMLEmitter emitter και θα χρειαστει επεκταση

(το api επιστρεφει κατι του στυλ)
<metadata>
<meta key="Server Label">Web Head 1</meta>
<meta key="Image Version">2.1</meta>
</metadata>

Αυτά πρέπει να προκύπτουν από το μοντέλο για τα metadata, ένα <meta key=KEY> tag για κάθε γραμμή του που αφορά στο συγκεκριμένο VM.

#12 Updated by Constantinos Venetsanopoulos about 13 years ago

  • Status changed from Feedback to Assigned

Έχω προσθέσει fixtures για metadata στα VMs, τα οποία δεν επιστρέφονται σωστά. Όλα τα υπόλοιπα φαίνεται να επιστρέφονται σωστά.

#13 Updated by Constantinos Venetsanopoulos about 13 years ago

Επίσης, να προστεθεί ως attribute (και όχι ως metadata) ένα πεδίο "description" στο server (όπως γίνεται και στα images)

#14 Updated by Constantinos Venetsanopoulos about 13 years ago

να επιστρέφεται και το attribute "progress" όπως ορίζεται στο RS API. Αρχικά, θα παίρνει τιμές μόνο "0" κατά το ξεκίνημα και "100" όταν τελειώσει το creation

#15 Updated by Markos Gogoulos about 13 years ago

έχουν μπει τα progress και description. Μένει το metadata

#16 Updated by Constantinos Venetsanopoulos about 13 years ago

To GET servers/detail και servers/id πρέπει να επιστρέφει τα πεδία:
flavorRef (αντι του flavorId)
imageRef (αντί του imageId)
+ created
+ updated

και γενικά όσα λείπουν από το OpenStack Compute API:
http://docs.openstack.org/openstack-compute/developer/content/ch04s01.html#d5e880

#17 Updated by Markos Gogoulos about 13 years ago

το flavorId έγινε flavorRef και το imageId έγινε imageRef. Επίσης μπήκαν τα created και updated. Πέρα απο το metadata το οποίο δεν εμφανιζεται σωστά, λείπει κάτι άλλο?

#18 Updated by Vangelis Koukis about 13 years ago

  • Assignee changed from Markos Gogoulos to Giorgos Verigakis

Διορθώθηκαν/διορθώνονται αρκετές λεπτομέρειες συμμόρφωσης με το API [βλ. και #301], το κλείνει ο [verigak] όταν τελειώσει.

#19 Updated by Vangelis Koukis about 13 years ago

  • Status changed from Assigned to Closed

Το /servers λειτουργεί κανονικά, ό,τι πρόβλημα προκύψει ανοίγει σε νέο ticket.

Also available in: Atom PDF