From 843f0cf2a4e7b581d94f1ed9888ea383a3d13ddd Mon Sep 17 00:00:00 2001 From: Alva Bandy Date: Thu, 5 Nov 2015 14:03:08 -0800 Subject: [PATCH 1/4] azure storage --- README.md | 6 +++++ main.go | 74 +++++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 72 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 5ae50da..b8f135d 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,8 @@ # webapp-go The sample app from Writing Web Applications on golang.org. + +# Get Azure SDK package: + +```sh +go get -d github.com/Azure/azure-sdk-for-go/management +``` \ No newline at end of file diff --git a/main.go b/main.go index 139a323..dd05c18 100644 --- a/main.go +++ b/main.go @@ -9,27 +9,83 @@ import ( "io/ioutil" "net/http" "regexp" + "bytes" + "os" + "errors" + "github.com/Azure/azure-sdk-for-go/storage" ) +var blobService storage.BlobStorageClient; +var containerName = os.Getenv("AZURE_STORAGE_CONTAINER_NAME"); + type Page struct { Title string Body []byte } -func (p *Page) save() error { - filename := p.Title + ".txt" - return ioutil.WriteFile(filename, p.Body, 0600) +func initAzureStorage() { + var storageKey = os.Getenv("AZURE_STORAGE_ACCESS_KEY"); + var storageName = os.Getenv("AZURE_STORAGE_ACCOUNT"); + client, err := storage.NewBasicClient(storageName, storageKey); + if err != nil { + panic(err); + } + + blobService = client.GetBlobService(); + ok, err := blobService.ContainerExists(containerName); + if err != nil { + panic(err) + } else if !ok { + err = blobService.CreateContainer(containerName, storage.ContainerAccessTypePrivate) + if err != nil { + panic(err); + } + } } -func loadPage(title string) (*Page, error) { - filename := title + ".txt" - body, err := ioutil.ReadFile(filename) +func (p *Page) save() error { + ok, err := blobService.BlobExists(containerName, p.Title) if err != nil { - return nil, err + return err + } + + if ok { + err = blobService.DeleteBlob(containerName, p.Title); + if err != nil { + return err + } } - return &Page{Title: title, Body: body}, nil + + err = blobService.CreateBlockBlobFromReader(containerName, p.Title, uint64(len(p.Body)), bytes.NewReader(p.Body)) + if err != nil { + return err + } + + return nil; } +func loadPage(title string) (*Page, error) { + ok, err := blobService.BlobExists(containerName, title) + if ok { + var body []byte + data, err := blobService.GetBlob(containerName, title) + if err == nil { + body, err = ioutil.ReadAll(data) + } + + if data != nil { + data.Close() + } + + return &Page{Title: title, Body: body}, err + }else { + if err == nil { + err = errors.New("Page ont found.") + } + return nil, err; + } +} + func viewHandler(w http.ResponseWriter, r *http.Request, title string) { p, err := loadPage(title) if err != nil { @@ -81,6 +137,8 @@ func makeHandler(fn func(http.ResponseWriter, *http.Request, string)) http.Handl } func main() { + initAzureStorage(); + http.HandleFunc("/view/", makeHandler(viewHandler)) http.HandleFunc("/edit/", makeHandler(editHandler)) http.HandleFunc("/save/", makeHandler(saveHandler)) From 1af763b72fa97f8866e5aa4b8a120ea926906e25 Mon Sep 17 00:00:00 2001 From: Alva Bandy Date: Thu, 5 Nov 2015 14:14:08 -0800 Subject: [PATCH 2/4] fix type --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index dd05c18..fc1db45 100644 --- a/main.go +++ b/main.go @@ -80,7 +80,7 @@ func loadPage(title string) (*Page, error) { return &Page{Title: title, Body: body}, err }else { if err == nil { - err = errors.New("Page ont found.") + err = errors.New("Page not found.") } return nil, err; } From 2ee7c95fcfb7eb674b6a61144ff6eb51420808fa Mon Sep 17 00:00:00 2001 From: Alva Bandy Date: Thu, 5 Nov 2015 14:39:24 -0800 Subject: [PATCH 3/4] fix format issues --- main.go | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/main.go b/main.go index fc1db45..44c0801 100644 --- a/main.go +++ b/main.go @@ -5,18 +5,18 @@ package main import ( + "bytes" + "errors" + "github.com/Azure/azure-sdk-for-go/storage" "html/template" "io/ioutil" "net/http" - "regexp" - "bytes" "os" - "errors" - "github.com/Azure/azure-sdk-for-go/storage" + "regexp" ) -var blobService storage.BlobStorageClient; -var containerName = os.Getenv("AZURE_STORAGE_CONTAINER_NAME"); +var blobService storage.BlobStorageClient +var containerName = os.Getenv("AZURE_STORAGE_CONTAINER_NAME") type Page struct { Title string @@ -24,21 +24,21 @@ type Page struct { } func initAzureStorage() { - var storageKey = os.Getenv("AZURE_STORAGE_ACCESS_KEY"); - var storageName = os.Getenv("AZURE_STORAGE_ACCOUNT"); - client, err := storage.NewBasicClient(storageName, storageKey); + var storageKey = os.Getenv("AZURE_STORAGE_ACCESS_KEY") + var storageName = os.Getenv("AZURE_STORAGE_ACCOUNT") + client, err := storage.NewBasicClient(storageName, storageKey) if err != nil { - panic(err); + panic(err) } - blobService = client.GetBlobService(); - ok, err := blobService.ContainerExists(containerName); + blobService = client.GetBlobService() + ok, err := blobService.ContainerExists(containerName) if err != nil { panic(err) } else if !ok { err = blobService.CreateContainer(containerName, storage.ContainerAccessTypePrivate) if err != nil { - panic(err); + panic(err) } } } @@ -50,7 +50,7 @@ func (p *Page) save() error { } if ok { - err = blobService.DeleteBlob(containerName, p.Title); + err = blobService.DeleteBlob(containerName, p.Title) if err != nil { return err } @@ -59,9 +59,9 @@ func (p *Page) save() error { err = blobService.CreateBlockBlobFromReader(containerName, p.Title, uint64(len(p.Body)), bytes.NewReader(p.Body)) if err != nil { return err - } + } - return nil; + return nil } func loadPage(title string) (*Page, error) { @@ -78,13 +78,13 @@ func loadPage(title string) (*Page, error) { } return &Page{Title: title, Body: body}, err - }else { + } else { if err == nil { err = errors.New("Page not found.") } - return nil, err; + return nil, err } -} +} func viewHandler(w http.ResponseWriter, r *http.Request, title string) { p, err := loadPage(title) @@ -137,7 +137,7 @@ func makeHandler(fn func(http.ResponseWriter, *http.Request, string)) http.Handl } func main() { - initAzureStorage(); + initAzureStorage() http.HandleFunc("/view/", makeHandler(viewHandler)) http.HandleFunc("/edit/", makeHandler(editHandler)) From 2f6e0c68e94c07ec4a9cb7c0fd0d895dcec4b727 Mon Sep 17 00:00:00 2001 From: Alva Bandy Date: Fri, 6 Nov 2015 11:50:44 -0800 Subject: [PATCH 4/4] updated based on comments --- main.go | 68 +++++++++++++++++++++------------------------------------ 1 file changed, 25 insertions(+), 43 deletions(-) diff --git a/main.go b/main.go index 44c0801..f3aac30 100644 --- a/main.go +++ b/main.go @@ -6,13 +6,12 @@ package main import ( "bytes" - "errors" "github.com/Azure/azure-sdk-for-go/storage" "html/template" "io/ioutil" "net/http" "os" - "regexp" + "regexp" ) var blobService storage.BlobStorageClient @@ -23,40 +22,28 @@ type Page struct { Body []byte } -func initAzureStorage() { +func initAzureStorage() error { var storageKey = os.Getenv("AZURE_STORAGE_ACCESS_KEY") var storageName = os.Getenv("AZURE_STORAGE_ACCOUNT") client, err := storage.NewBasicClient(storageName, storageKey) if err != nil { - panic(err) + return err; } + blobService = client.GetBlobService() - ok, err := blobService.ContainerExists(containerName) + _, err = blobService.CreateContainerIfNotExists(containerName, storage.ContainerAccessTypePrivate) if err != nil { - panic(err) - } else if !ok { - err = blobService.CreateContainer(containerName, storage.ContainerAccessTypePrivate) - if err != nil { - panic(err) - } - } + return err; + } + + return nil; } func (p *Page) save() error { - ok, err := blobService.BlobExists(containerName, p.Title) - if err != nil { - return err - } - - if ok { - err = blobService.DeleteBlob(containerName, p.Title) - if err != nil { - return err - } - } - - err = blobService.CreateBlockBlobFromReader(containerName, p.Title, uint64(len(p.Body)), bytes.NewReader(p.Body)) + // ignoring error since we do not care if the file doesn't exist + blobService.DeleteBlob(containerName, p.Title) + err := blobService.CreateBlockBlobFromReader(containerName, p.Title, uint64(len(p.Body)), bytes.NewReader(p.Body)) if err != nil { return err } @@ -65,25 +52,17 @@ func (p *Page) save() error { } func loadPage(title string) (*Page, error) { - ok, err := blobService.BlobExists(containerName, title) - if ok { - var body []byte - data, err := blobService.GetBlob(containerName, title) - if err == nil { - body, err = ioutil.ReadAll(data) - } - - if data != nil { - data.Close() - } + var body []byte + data, err := blobService.GetBlob(containerName, title) + if err == nil { + body, err = ioutil.ReadAll(data) + } - return &Page{Title: title, Body: body}, err - } else { - if err == nil { - err = errors.New("Page not found.") - } - return nil, err + if data != nil { + data.Close() } + + return &Page{Title: title, Body: body}, err } func viewHandler(w http.ResponseWriter, r *http.Request, title string) { @@ -137,7 +116,10 @@ func makeHandler(fn func(http.ResponseWriter, *http.Request, string)) http.Handl } func main() { - initAzureStorage() + err := initAzureStorage() + if err != nil { + panic(err) + } http.HandleFunc("/view/", makeHandler(viewHandler)) http.HandleFunc("/edit/", makeHandler(editHandler))