Projekt bazy uniwersalnego dashboarda

Transkrypt

Projekt bazy uniwersalnego dashboarda
Projekt bazy uniwersalnego dashboarda
Stanisław Klekot, nr indeksu 126398
3 marca 2013
1
Opis wycinka rzeczywistości
DashWiki to w założeniu aplikacja typu wiki dla administratorów. Od tradycyjnych silników
różni się tym, że potrafi pobierać dane użyte do wypełnienia strony z zewnętrznych źródeł, takich
jak system monitoringu czy system zbierania danych o wydajności i rysowania wykresów. Łączenie
się z zewnętrznymi systemami realizowane jest za pomocą makr użytych w treści strony.
DashWiki ma służyć przede wszystkim za panel kontrolny („dashboard”), na którym są zebrane najważniejsze informacje o bieżącym stanie sieci, serwerów czy aplikacji i z którego da się
łatwo dostać do paneli z danymi szczegółowymi (które mogą być kolejnymi stronami wiki albo
zewnętrznymi webaplikacjami).
Użytkownik
Żeby móc wyedytować stronę użytkownik musi się zalogować, więc DashWiki powinno znać
nazwę tego użytkownika (reg008). Użytkownik ma już login dla innych systemów i typowo jest to
niedługi ciąg znaków (do 64 znaków; ogr015). Oczywiście login jest unikalny (ogr014).
Typowa funkcja skrótu zwraca 128 do 256 bitów, co w systemie szesnastkowym powinno się
dać zapisać za pomocą 64 cyfr — hasz hasła może mieć zatem do 64 znaków (ogr016).
Strona wiki
Strona ma pewną nazwę (unikalną; reg001) i zawartość, która mówi, jaki tekst i jak sformatowany należy wyświetlić w przeglądarce.
Nazwy stron w DashWiki nie odbiegają od tradycyjnych silników, stosowana jest konwencja
„CamelCase” z użyciem liter, cyfr i podkreślnika, możliwe jest też użycie w nazwie slasha (dla zbudowania hierarchii stron); nazwa strony powinna mieć od 2 do 128 znaków (ogr002). Oczywiście
dwie różne strony nie mogą mieć tej samej nazwy (ogr001).
Zawartość strony jest tekstem bez specjalnych ograniczeń oprócz użytego języka formatowania
(ogr003).
Ze względu na koszt parsowania i przetwarzania języka formatowania strona jest jeszcze opatrzona skrótem (haszem) treści, który może być użyty jako identyfikator dla gotowego kodu HTML
w cache’u. Skrót jest ciągiem znaków o długości do 64 znaków (ogr004).
Strona domowa
Użytkownik może mieć ustawioną stronę startową, która wyświetla się mu po zalogowaniu
(reg009). Jeśli nie ma ustawionej takiej strony, wyświetla się domyślna. Strona startowa, jeśli
jest ustawiona (reg011), musi być prawidłową nazwą strony (ogr017, ogr017).
To użytkownik wybiera swoją stronę startową, więc nie każda strona będzie czyjąś startową
(reg010), a niektóre strony będą startowymi dla wielu użytkowników (reg012).
Treść strony — makra
W treści strony można używać makr. Każde z makr jest identyfikowane jednoznacznie przez
nazwę (reg022 ogr025), która jest niepustym ciągiem do 64 znaków (ogr026).
Makro w użyciu przypomina funkcję z języków programowania: ma listę przyjmowanych argumentów w postaci ciągu słów oddzielonych przecinkami (do 256 znaków; ogr027) i typ zwracanych
danych (jedno słowo do 64 znaków; ogr028, reg029, reg031). Zwracany typ służy do ustalenia
w jaki sposób traktować użycie makra: „lista” powoduje, że zostanie wygenerowany zestaw wierszy w tabeli, po jednym wierszu dla każdego elementu z wyniku; „grafika” wstawia w miejscu
makra obraz PNG/GIF/JPEG (w typowym przypadku będzie to wykres zmian pewnej wartości
w czasie), „stan” to krótki tekst opisujący bieżącą sytuację usługi czy hosta (przykładowo „działa”, „wyłączony”, „nie wiadomo”) i tak dalej. Zwracany typ jest identyfikowany przez nazwę
(reg028).
1
Makro jest elementem, którego użycie powoduje komunikację z innymi systemami, więc potrzebne są informacje na temat celu komunikacji (URL, para host+port albo analogiczne, opisane
przez ciąg do 256 znaków; ogr030). Do komunikacji z celem makro używa jednego z kilku protokołów, jak XML-RPC, SOAP czy zwykłe żądanie HTTP GET (reg023). Nazwa protokołu jest
ciągiem do 64 znaków (ogr029).
Każde makro musi skądś pobierać dane, więc musi mieć zdefiniowany dokładnie jeden protokół
(reg024, reg026).
Makro jest sparametryzowane po to, żeby mogło żądać od zewnętrznego systemu danych na
temat różnych obiektów. Żeby to uzyskać makro musi przekazać w żądaniu parametry. Opis tych
parametrów jest ciągiem do 256 znaków (ogr031).
Makra są definiowane przez użytkownika, a obsługiwane przez DashWiki protokoły i typy
zwaracanych danych są zdefiniowane przez samą aplikację, może więc istnieć protokół albo typ
danych, który nie jest używany przez żadne makro (reg025, reg030), może też istnieć protokół
albo typ danych używany przez wiele makr (reg027, reg032).
Historia edycji stron
Każda strona ma swoją historię edycji. Dane historyczne mają podobną strukturę do zwykłych
stron (nazwa, zawartość i skrót o takich samych typach; ogr005, ogr006, ogr007), rozszerzoną
o dodatkowe informacje: czas utworzenia (data z godziną; ogr008), kolejny numer zwany rewizją
(liczba całkowita 32-bitowa większa od 0; ogr009) i autora (reg013). Autorem musi być jeden
użytkownik (ogr010, reg015), ta informacja ma zatem tę samą formę.
Użytkownik mógł nie utworzyć żadnej strony (reg014), mógł również utworzyć wiele stron
(reg016).
Strona wiki musi mieć odpowiadającą jej historię — odpowiednia strona w historii ma tę samą
nazwę (reg004), przy czym najnowsza (o najwyższej rewizji) strona w historii o tej nazwie musi
mieć taką samą zawartość i taki sam hasz, jak strona (reg006, reg007).
Strona w historii nie musi mieć odpowiadającej jej strony, jeśli strona o tej nazwie została
usunięta (reg005). Rekord odpowiadający usunięciu strony będzie w takim przypadku zawierał
NULL w zawartości i w haszu.
Nie mogą istnieć w historii dwie wersje tej samej strony, które mają tę samą rewizję albo ten
sam czas utworzenia (ogr012, ogr013, reg002, reg003).
Sesja HTTP
Użytkownik musi być zalogowany żeby móc edytować strony. Do ustalenia które żądanie HTTP
jest od zalogowanego użytkownika służy sesja.
Każda sesja ma unikalny identyfikator, losowy ciąg znaków o długości do 64 znaków (reg017,
ogr019, ogr020).
Sesja może być przypisana do użytkownika (reg020, ogr021 i ogr022, bo właściciel musi mieć
ten sam format), ale nie musi, gdy dotyczy niezalogowanego odwiedzającego (reg018).
Użytkownik nie musi być zalogowany do DashWiki, więc może nie mieć żadnej sesji (reg019),
może też być zalogowany wielokrotnie na różnych stanowiskach (reg021).
Sesja ma czas wygaśnięcia podany w formie daty z godziną (ogr023).
Sesja przenosi informację o stanie aplikacji między żądaniami HTTP. Ta informacja (zmienne
sesyjne) jest zbiorem zmiennych zserializowanym do formatu JSON. Nie ma specjalnych ograniczeń
na wielkość tego środowiska (ogr024).
2
2
2.1
Reguły funkcjonowania i ograniczenia dziedzinowe
Reguły funkcjonowania
oznaczenie
reg001
reg002
reg003
reg004
reg005
reg006
reg007
reg008
reg009
reg010
reg011
reg012
reg013
reg014
reg015
reg016
reg017
reg018
reg019
reg020
reg021
reg022
reg023
reg024
reg025
reg026
reg027
reg028
reg029
reg030
reg031
reg032
definicja
strona jest identyfikowanym przez nazwę opisem dashboarda
strona w historii jest identyfikowaną przez nazwę i datę utworzenia wersją strony
strona w historii alternatywnie jest identyfikowana przez nazwę i rewizję
strona musi mieć odpowiadającą jej stronę w historii o tej samej nazwie
strona w historii nie musi odpowiadać żadnej stronie
strona ma jedną odpowiadającą jej stronę w historii
strona w historii odpowiada najwyżej jednej stronie
użytkownik jest zalogowaną do aplikacji osobą mogącą edytować strony; identyfikowany jest przez nazwę
użytkownik może mieć zdefiniowaną stronę domową
strona nie musi być stroną domową użytkownika
użytkownik ma najwyżej jedną stronę domową
strona może być stroną domową wielu użytkowników
strona w historii musi mieć użytkownika jako autora
użytkownik nie musi być autorem żadnej strony w historii
strona w historii ma jednego użytkownika jako autora
użytkownik może być autorem wielu stron w historii
sesja to zbiór zmiennych w aplikacji identyfikowany przez identyfikator sesji
sesja może dotyczyć użytkownika
użytkownik może nie mieć żadnej sesji
sesja dotyczy najwyżej jednego użytkownika
użytkownik może mieć wiele sesji
makro to identyfikowana przez nazwę funkcja, której można użyć w opisie dashboarda
protokół to identyfikowany przez nazwę sposób komunikacji z zewnętrznymi aplikacjami (używany przez makro)
makro musi mieć zdefiniowany protokół
protokół nie musi być używany przez żadne makro
makro ma zdefiniowany jeden protokół
protokół może być używany przez wiele makr
typ danych to identyfikowany przez nazwę rodzaj danych zwracany przez makro
makro musi mieć zdefiniowany zwracany typ danych
typ danych nie musi być zwracany przez żadne makro
makro zwraca jeden typ danych
typ danych może być zwracany przez wiele makr
Tabela 1: Lista reguł funkcjonowania opisanego wycinka rzeczywistości
2.2
Ograniczenia dziedzinowe
oznaczenie
ogr001
ogr002
ogr003
ogr004
ogr005
definicja
nazwa strony jest unikalna
nazwa strony jest ciągiem od 2 do 128 znaków, składającym się z liter, cyfr,
podkreślenia i slasha, zaczynającym się od wielkiej litery
zawartość strony jest tekstem dowolnej długości
skrót zawartości strony jest ciągiem od 0 do 64 znaków
nazwa strony w historii jest ciągiem od 2 do 128 znaków, składającym się z liter,
cyfr, podkreślenia i slasha, zaczynającym się od wielkiej litery
3
oznaczenie
ogr006
ogr007
ogr008
ogr009
ogr010
ogr011
ogr012
ogr013
ogr014
ogr015
ogr016
ogr017
ogr018
ogr019
ogr020
ogr021
ogr022
ogr023
ogr024
ogr025
ogr026
ogr027
ogr028
ogr029
ogr030
ogr031
definicja
zawartość strony w historii jest tekstem dowolnej długości
skrót zawartości strony w historii jest ciągiem od 0 do 64 znaków
czas utworzenia strony w historii jest datą z godziną
rewizja strony w historii jest liczbą całkowitą z zakresu [1, 232 − 1]
autor strony w historii jest użytkownikiem
nazwa autora strony w historii jest ciągiem od 0 do 64 znaków
strona w historii ma unikalną parę nazwa + rewizja
strona w historii ma unikalną parę nazwa + czas utworzenia
nazwa użytkownika jest unikalna
nazwa użytkownika jest ciągiem od 0 do 64 znaków
hasz hasła użytkownika jest ciągiem od 0 do 64 znaków
strona startowa użytkownika odpowiada nazwie strony wiki
strona startowa użytkownika jest ciągiem od 0 do 128 znaków
identyfikator sesji jest unikalny
identyfikator sesji jest ciągiem od 0 do 64 znaków
odwiedzający, do którego należy sesja, jest użytkownikiem
nazwa odwiedzającego, do którego należy sesja, jest od 0 do 64 znaków
czas wygaśnięcia sesji jest datą z godziną
zestaw zmiennych sesyjnych sesji jest tekstem dowolnej długości
nazwa makra jest unikalna
nazwa makra jest ciągiem od 1 do 64 znaków
przyjmowane parametry makra są opisane ciągiem od 0 do 256 znaków
typ danych zwracany przez makro jest ciągiem od 0 do 64 znaków
protokół używany przez makro jest ciągiem od 0 do 64 znaków
cel makra jest ciągiem od 0 do 256 znaków
parametry dla celu makra są opisane ciągiem od 0 do 256 znaków
Tabela 2: Lista ograniczeń dziedzinowych w opisanym wycinku rzeczywistości
3
Definicje predykatowe encji
oznaczenie
enc001
enc002
enc003
enc004
enc005
enc006
enc007
definicja
Page(page name, content, hash)
HistoryPage(hist page name, hist content, hist hash, creation time, revision)
User(user name, password hash)
Session(session id, expiry time, variables)
Macro(macro name, destination, input args, output args)
Protocol(protocol)
ResultType(result type)
Tabela 3: Definicje encji w bazie
4
4
Definicje predykatowe związków między encjami
oznaczenie
zwi001
zwi002
zwi003
zwi004
zwi005
zwi006
definicja
HasHomePage(User(0..*) : Page(0..1))
IsAuthor(HistoryPage(0..*) : User(1..1))
IsSessionFor(Session(0..*) : User(0..1))
UsesProtocol(Macro(0..*) : Protocol(1..1))
ReturnsType(Macro(0..*) : ResultType(1..1))
HasHistory(Page(0..*) : HistoryPage(1..1))
Tabela 4: Definicje relacji w bazie
5
Diagram związków encji
Diagram ER dla DashWiki
5
6
Definicje relacji
oznaczenie
rel001
rel002
rel003
rel004
rel005
rel006
rel007
definicja
Pages(page name, content, hash, #(hist page name,creation time))
HistoryPages(hist page name, hist content, hist hash, creation time, revision, #user name)
Users(user name, password hash, #page name)
Sessions(session id, expiry time, variables, #user name)
Macros(macro name, destination, input args, output args, #protocol, #result type)
Protocols(protocol)
ResultTypes(result type)
Tabela 5: Definicje relacji między encjami
7
Opisy relacji
7.1
rel001 Pages
pochodzenie relacji
enc001 Page(page name, content, hash)
wykorzystywane związki
zwi006 HasHistory(Page(0..*) : HistoryPage(1..1))
atrybut
page name
content
hash
hist page name
creation time
dziedzina
łańcuch(128)
tekst
łańcuch(64)
łańcuch(128)
czas
ograniczenie
PK, /^[A-Z][A-Za-z0-9_/]+$/
NOT NULL
NOT NULL
ograniczenia tablicowe
• FK(hist page name, creation time) HistoryPage — zwi006
6
uwagi
reg001, ogr001, ogr002
ogr003
ogr004
zwi006
zwi006
7.2
rel002 HistoryPages
pochodzenie relacji
enc002 HistoryPage(hist page name, hist content, hist hash, creation time, revision)
wykorzystywane związki
zwi002 IsAuthor(HistoryPage(0..*) : User(1..1))
atrybut
hist page name
hist content
hist hash
creation time
revision
author
dziedzina
łańcuch(128)
tekst
łańcuch(64)
czas
liczba(9)
łańcuch(64)
ograniczenie
NOT NULL, /^[A-Z][A-Za-z0-9_/]+$/
NOT NULL
NOT NULL
FK Users
uwagi
ogr005,
ogr006
ogr007
ogr008,
ogr009,
ogr010,
ograniczenia tablicowe
• PK(hist page name, creation time) — reg002
• UNIQUE(hist page name, revision) — reg003
7.3
rel003 Users
pochodzenie relacji
enc003 User(user name, password hash)
wykorzystywane związki
zwi001 HasHomePage(User(0..*) : Page(0..1))
atrybut
user name
password hash
home page
dziedzina
łańcuch(64)
łańcuch(64)
łańcuch(128)
ograniczenie
PK
FK Pages
ograniczenia tablicowe
brak
7
uwagi
ogr014, ogr015, reg008
ogr016
ogr017, ogr018, zwi001
reg002, reg003
reg002
reg003
ogr011, zwi002
7.4
rel004 Sessions
pochodzenie relacji
enc004 Session(session id, expiry time, variables)
wykorzystywane związki
zwi003 IsSessionFor(Session(0..*) : User(0..1))
atrybut
session id
expiry time
variables
user name
dziedzina
łańcuch(64)
czas
tekst
łańcuch(64)
ograniczenie
PK
FK Users
uwagi
reg017, ogr019, ogr020
ogr023
ogr024
ogr021, ogr022, zwi003
ograniczenia tablicowe
brak
7.5
rel005 Macros
pochodzenie relacji
enc005 Macro(macro name, destination, input args, output args)
wykorzystywane związki
zwi004 UsesProtocol(Macro(0..*) : Protocol(1..1))
zwi005 ReturnsType(Macro(0..*) : ResultType(1..1))
atrybut
macro name
destination
input args
output args
protocol
result type
dziedzina
łańcuch(64)
łańcuch(256)
łańcuch(256)
łańcuch(256)
łańcuch(64)
łańcuch(64)
ograniczenie
PK, length > 0
NOT NULL, FK Protocols
NOT NULL, FK ResultTypes
ograniczenia tablicowe
brak
8
uwagi
reg022, ogr025, ogr026
ogr030
ogr027
ogr031
ogr029, zwi004
ogr028, zwi005
7.6
rel006 Protocols
pochodzenie relacji
enc006 Protocol(protocol)
wykorzystywane związki
brak
atrybut
protocol
dziedzina
łańcuch(64)
ograniczenie
PK
uwagi
reg023, ogr029
ograniczenia tablicowe
brak
7.7
rel007 ResultTypes
pochodzenie relacji
enc007 ResultType(result type)
wykorzystywane związki
brak
atrybut
result type
dziedzina
łańcuch(64)
ograniczenie
PK
ograniczenia tablicowe
brak
9
uwagi
reg028, ogr028

Podobne dokumenty