Как заказать и удалить блочное хранилище iscsi на SoftLayer с помощью API?

Я пытаюсь создать хранилище Endurance для тома iSCSI (блочное хранилище). Я использую API SoftLayer в ходу. какова процедура создания удаляемого хранилища?


person Akhil Reddy    schedule 08.02.2017    source источник
comment
Пожалуйста, отредактируйте свой вопрос, чтобы показать что вы уже пробовали. Вы должны включить минимально воспроизводимый пример кода, с которым у вас возникли проблемы, тогда мы можем попытаться помочь с конкретная проблема. Вы также должны прочитать Как спросить.   -  person Toby Speight    schedule 08.02.2017


Ответы (2)


SoftLayer_Product_Order::verifyOrder — запрос POST без softlayer-go

Наконец-то я нашел простой способ расшифровать ответы :), вот почтовый запрос для SoftLayer_Product_Order: :verifyOrder, я определил json в jsonStr, как вы видите:

// Verify Order for VSI
//
// This script verifies an order for vsi
//
// important manual pages:
// http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/verifyOrder
// http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/placeOrder
//
// @License: http://sldn.softlayer.com/article/License
// @Author: SoftLayer Technologies, Inc. <[email protected]>


package main

import (
    "fmt"
    "net/http"
    "bytes"
    "io/ioutil"
)


func main() {
    url := "https://username:[email protected]/rest/v3/SoftLayer_Product_Order/verifyOrder"
    fmt.Println("URL:>", url)

    // Define the json to send
    var jsonStr = []byte(`{"parameters":[{"location":"AMSTERDAM","packageId":46,"quantity":1,"hardware":[{"domain":"softlayer.com","hostname":"rcvtest"}],"prices":[{"id":50231},{"id":52135},{"id":51639},{"id":51569},{"id":52363},{"id":61019},{"id":55},{"id":57},{"id":175777},{"id":273},{"id":21},{"id":51481},{"id":905},{"id":58},{"id":420},{"id":418}]}]}`)
    req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }

    defer resp.Body.Close()

    fmt.Println("response Status:", resp.Status)
    fmt.Println("response Headers:", resp.Header)
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println("response Body:", string(body))
}

Замените: имя пользователя и APIKey своими данными в запросе.


SoftLayer_Account::getVirtualGuests — Скрипт с фильтром объектов и масками объектов

Здесь скрипт с objectFilter и objectMasks, определенными в запросе для SoftLayer_Account::getVirtualGuests метод, чтобы получить виртуального гостя:

// This script get virtual guest through id using object filter and mask
//
// important manual pages:
// http://sldn.softlayer.com/reference/services/SoftLayer_Account/getVirtualGuests
// http://sldn.softlayer.com/article/object-filters
// http://sldn.softlayer.com/article/object-masks
//
// @License: http://sldn.softlayer.com/article/License
// @Author: SoftLayer Technologies, Inc. <[email protected]>


package main

import (
    "fmt"
    "net/http"
     "io/ioutil"
)

func main() {
    url := `https://username:[email protected]/rest/v3/SoftLayer_Account/getVirtualGuests?objectFilter={"virtualGuests":{"id":{"operation":27497599}}}&objectMask=mask[billingItem]`
    fmt.Println("URL:>", url)

    req, err := http.NewRequest("GET", url, nil)


    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    fmt.Println("response Status:", resp.Status)
    fmt.Println("response Headers:", resp.Header)
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println("response Body:", string(body))
}

Замените: имя пользователя, ключ API и 27497599 на свою информацию в запросе.


SoftLayer_Product_Package::getItemPrices — Запрос с использованием objetFilter

Здесь скрипт с objectFilter для SoftLayer_Product_Package::getItemPrices для получения продукта цены на предметы (стандартные) для места для хранения производительности (скрипт, предоставленный в моем другом ответе с использованием softlayer-go),

Как видите, я установил is+null, потому что пробел вызвал исключение, но все работает нормально.

// Retrieve product item prices for performance storage space using objectFilter
//
// important manual pages:
// http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getItemPrices
// http://sldn.softlayer.com/article/object-filters
//
// @License: http://sldn.softlayer.com/article/License
// @Author: SoftLayer Technologies, Inc. <[email protected]>

package main

import (
    "fmt"
    "log"
    "net/http"
     "io/ioutil"
)

func main() {
    url := `https://username:[email protected]/rest/v3/SoftLayer_Product_Package/240/getItemPrices?objectFilter={"itemPrices":{"item":{"capacity":{"operation":40}},"attributes":{"value":{"operation":300}},"categories":{"categoryCode":{"operation":"performance_storage_space"}},"locationGroupId":{"operation":"is+null"}}}`
    fmt.Println("URL:>", url)

    req, err := http.NewRequest("GET", url, nil)

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        log.Fatal("Do: ", err)
        return
    }

    defer resp.Body.Close()

    fmt.Println("response Status:", resp.Status)
    fmt.Println("response Headers:", resp.Header)
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println("response Body:", string(body))
}

Заменить: имя пользователя и APIKey в запросе

Я надеюсь, что эти скрипты помогут вам, дайте мне знать, если у вас есть какие-либо проблемы или сомнения.

person Ruber Cuellar Valenzuela    schedule 17.02.2017

Чтобы создать блочное хранилище - выносливость, вы можете попробовать следующий скрипт:

// Order Block Storage - Endurance
// This script creates an order for Block Storage - Endurance
//
// See below references for more details.
// important manual pages:
// http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order
// http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/placeOrder/
// @License: http://sldn.softlayer.com/article/License
// @Author: SoftLayer Technologies, Inc. <[email protected]>

package main

import (
    "fmt"
    "github.com/softlayer/softlayer-go/datatypes"
    "github.com/softlayer/softlayer-go/services"
    "github.com/softlayer/softlayer-go/session"
    "github.com/softlayer/softlayer-go/sl"
    "encoding/json"
)

func main() {
  username    := "set me"
  apikey      := "set me"

  complexType := "SoftLayer_Container_Product_Order_Network_Storage_Enterprise"
  quantity    := 1
  location    := "265592"
  packageId   := 240
  osKeyName   := "LINUX"
  quote       := false

  // 1. Create a session
  sess := session.New(username, apikey)

  // 2. Get a service
  service := services.GetProductOrderService(sess)

  osFormatType := &datatypes.Network_Storage_Iscsi_OS_Type{
    KeyName: sl.String(osKeyName),    
  }

  prices := []datatypes.Product_Item_Price{
    datatypes.Product_Item_Price{ Id: sl.Int(45098) },  // Block Storage
    datatypes.Product_Item_Price{ Id: sl.Int(45058) },  // Endurance Storage
    datatypes.Product_Item_Price{ Id: sl.Int(45148) },  // 40 GB Storage Space
    datatypes.Product_Item_Price{ Id: sl.Int(45068) },  // 0.25 IOPS per GB
  }

  cpo := datatypes.Container_Product_Order {
    ComplexType   : sl.String(complexType),
    Quantity      : sl.Int(quantity),
    Location      : sl.String(location),
    PackageId     : sl.Int(packageId),         
    Prices        : prices,
  }

  cponp := datatypes.Container_Product_Order_Network_Storage_Enterprise {
    Container_Product_Order : cpo,
    OsFormatType            : osFormatType,
  }


  // 4. Invoke a method
    containerProductOrder, err := service.PlaceOrder(&cponp,&quote)
    if err != nil {
        fmt.Printf("%s\n", err)
        return
    } 

  cpoMarshed, errMarsh := json.Marshal(containerProductOrder)
  if errMarsh != nil {
    fmt.Println(errMarsh)
    return
  }

  fmt.Println(string(cpoMarshed))
}

Если вам нужна помощь с ценами, этот метод может помочь:

Важная ссылка на цены:

Чтобы отменить сохранение

// Cancel Storage
//
// This script cancels the storage, passing a storage billing ID to
// SoftLayer_Billing_Item::cancelService method.
//
// See below references for more details.
// Important manual pages:
// http://sldn.softlayer.com/reference/services/SoftLayer_Billing_Item/cancelService
// @License: http://sldn.softlayer.com/article/License
// @Author: SoftLayer Technologies, Inc. <[email protected]>

package main

import (
    "fmt"
    "github.com/softlayer/softlayer-go/services"
    "github.com/softlayer/softlayer-go/session"
)

func main() {
  username    := "set me"
  apikey      := "set me"

  storageId := 19771755

  sess := session.New(username, apikey)

  networkService := services.GetNetworkStorageService(sess)
  billingService := services.GetBillingItemService(sess)

  mask := "billingItem" 

  network, err := networkService.Id(storageId).Mask(mask).GetObject()
    if err != nil {
        fmt.Printf("%s\n", err)
        return
    } 

  result, err := billingService.Id(*network.BillingItem.Id).CancelService()
    if err != nil {
        fmt.Printf("%s\n", err)
        return
    }

  fmt.Println(result)
}

Ссылки:


Чтобы получить имя луны хранилища и целевой адрес с помощью идентификатора заказа хранилища

// Get Storage through orderId
//
// See below references for more details.
// Important manual pages:
// http://sldn.softlayer.com/reference/services/SoftLayer_Account/getNetworkStorage
//
// @License: http://sldn.softlayer.com/article/License
// @Author: SoftLayer Technologies, Inc. <[email protected]>

package main

import (
    "fmt"
    "github.com/softlayer/softlayer-go/services"
    "github.com/softlayer/softlayer-go/session"
    "encoding/json"
)

func main() {
  username    := "set me"
  apikey      := "set me"
  orderId     := "6199311"

  sess := session.New(username, apikey)

  accountService := services.GetAccountService(sess)

  filter := `{"networkStorage": {"billingItem": {"orderItem": {"order": {"id": {"operation": `+orderId+`}}}}}}`
  mask   := "username;serviceResourceBackendIpAddress"

  result, err := accountService.Mask(mask).Filter(filter).GetNetworkStorage()
    if err != nil {
        fmt.Printf("%s\n", err)
        return
    } 

  storage, errMarsh := json.Marshal(result)
  if errMarsh != nil {
    fmt.Println(errMarsh)
    return
  }

  fmt.Println(string(storage))
}


    // Get Storage through orderId
    //
    // See below references for more details.
    // Important manual pages:
    // http://sldn.softlayer.com/reference/services/SoftLayer_Account/getNetworkStorage
    //
    // @License: http://sldn.softlayer.com/article/License
    // @Author: SoftLayer Technologies, Inc. <[email protected]>

    package main

    import (
        "fmt"
        "github.com/softlayer/softlayer-go/services"
        "github.com/softlayer/softlayer-go/session"
        "encoding/json"
    )

    func main() {
      username    := "set me"
      apikey      := "set me"
      orderId     := "6199311"

      sess := session.New(username, apikey)

      accountService := services.GetAccountService(sess)

      filter := `{"networkStorage": {"billingItem": {"orderItem": {"order": {"id": {"operation": `+orderId+`}}}}}}`
      mask   := "username;serviceResourceBackendIpAddress"

      result, err := accountService.Mask(mask).Filter(filter).GetNetworkStorage()
        if err != nil {
            fmt.Printf("%s\n", err)
            return
        } 

      storage, errMarsh := json.Marshal(result)
      if errMarsh != nil {
        fmt.Println(errMarsh)
        return
      }

      fmt.Println(string(storage))
    }

Замените: имя пользователя, apikey и 6199311 своей информацией.

Ссылки:


Чтобы получить стандартные цены (группа местоположений = null)

// Retrieve product item prices which location group is null
//
// See below references for more details.
// important manual pages:
// http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getItemPrices
//
// @License: http://sldn.softlayer.com/article/License
// @Author: SoftLayer Technologies, Inc. <[email protected]>

package main

import (
    "fmt"
    "github.com/softlayer/softlayer-go/services"
    "github.com/softlayer/softlayer-go/session"
    "encoding/json"
)

func main() {
  username    := "set me"
  apikey      := "set me"

  packageId   := 240

  // 1. Create a session
  sess := session.New(username, apikey)

  // 2. Get a service
  packageService := services.GetProductPackageService(sess)

  // Declare a filter to get standard prices
  filter := `{"itemPrices":{"locationGroupId":{"operation": "is null"}}}`

  packageResult, err := packageService.Id(packageId).Filter(filter).GetItemPrices()
  if err != nil {
    fmt.Print("%s\n", err)
    return
  }

  prices, errMarsh := json.Marshal(packageResult)
  if errMarsh != nil {
    fmt.Println(errMarsh)
    return
  }

  fmt.Println(string(prices))
}

Получение цен на товары (стандартные) для производительного хранилища

// Retrieve product item prices for performance storage space
//
// See below references for more details.
// important manual pages:
// http://sldn.softlayer.com/reference/services/SoftLayer_Product_Package/getItemPrices
//
// @License: http://sldn.softlayer.com/article/License
// @Author: SoftLayer Technologies, Inc. <[email protected]>

package main

import (
    "fmt"
    "github.com/softlayer/softlayer-go/services"
    "github.com/softlayer/softlayer-go/session"
    "encoding/json"
)

func main() {
  username    := "set me"
  apikey      := "set me"

  packageId   := 240

  // 1. Create a session
  sess := session.New(username, apikey)

  // 2. Get a service
  packageService := services.GetProductPackageService(sess)

  // Declare a filter to get standard prices
  filter := `{"itemPrices":{"item":{"capacity":{"operation":40}}, "attributes":{"value":{"operation":300}}, "locationGroupId":{"operation": "is null"}, "categories":{"categoryCode":{"operation":"performance_storage_space"}}}}`

  packageResult, err := packageService.Id(packageId).Filter(filter).GetItemPrices()
  if err != nil {
    fmt.Print("%s\n", err)
    return
  }

  prices, errMarsh := json.Marshal(packageResult)
  if errMarsh != nil {
    fmt.Println(errMarsh)
    return
  }

  fmt.Println(string(prices))
}

SoftLayer_Account/getObject без использования softlayer-go

Возможно, что-то вроде этого может помочь вам:

Я попробовал это и создал следующий скрипт для получения части данных из SoftLayer_Account:: getObject ответ:

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
)

type Account struct {
    Id int `json:"id"`
    Address1 string `json:"address1"`
    FirstName string `json:"firstName"`
}

func main() {

    url := fmt.Sprintf("https://username:[email protected]/rest/v3/SoftLayer_Account/getObject")

    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        log.Fatal("NewRequest: ", err)
        return
    }

    client := &http.Client{}

    resp, err := client.Do(req)
    if err != nil {
        log.Fatal("Do: ", err)
        return
    }

    defer resp.Body.Close()

    var record Account

    // Use json.Decode for reading streams of JSON data
    if err := json.NewDecoder(resp.Body).Decode(&record); err != nil {
        log.Println(err)
    }

    fmt.Println("Response = ", record)
    fmt.Println("FirstName = ", record.FirstName)

}

Замените: имя пользователя и apiKey своими учетными данными.

Насколько я понимаю Golang, необходимо определить структуру ответа (я не уверен, но это единственный способ, которым я смог расшифровать ответ) см. type Account struct в скрипте, вы можете просмотрите следующие типы данных (структуры) для этого в softlayer-go, чтобы получить четкое представление об этом:

person Ruber Cuellar Valenzuela    schedule 08.02.2017
comment
Благодарю вас. Цены останутся прежними или время от времени будут меняться? - person Akhil Reddy; 08.02.2017
comment
идентификаторы цен не изменятся, но нужно учитывать, что они разные для каждого датацентра, поэтому в таком случае рекомендую использовать стандартные цены - person Ruber Cuellar Valenzuela; 08.02.2017
comment
Можно ли получить имя LUN и целевой адрес блока iscsi, используя идентификатор заказа? - person Akhil Reddy; 09.02.2017
comment
Пожалуйста, ознакомьтесь с разделом Чтобы получить имя лунного хранилища и целевой адрес через хранилище orderId в моем ответе - person Ruber Cuellar Valenzuela; 10.02.2017
comment
[{id:146445,locationGroupId:503},{id:45144,locationGroupId:null}] как получить идентификатор записи, чей locationid равен нулю в golang. - person Akhil Reddy; 13.02.2017
comment
Пожалуйста, попробуйте сценарий, который я прикрепил в разделе Чтобы получить стандартные цены (группа местоположений = null) в моем ответе. - person Ruber Cuellar Valenzuela; 13.02.2017
comment
url:=uname:[email protected]. com/rest/v3/SoftLayer_Product_Package/{itemPrices:{item:{capacity:{operation:40}},attributes:{value:{operation:300}},locationGroupId:{operation: is null},categories :{categoryCode:{operation:performance_storage_space}}}} как сделать этот вызов API из кода golang вместо того, как вы упомянули выше. - person Akhil Reddy; 14.02.2017
comment
Привет Рубер, Спасибо за помощь, очень ценю это. Я хотел бы знать, есть ли какая-либо ссылка или какой-либо источник относительно использования библиотеки softLayer go. Если да, пожалуйста, сообщите нам, даже один из моих коллег (BalaSrinivas) взаимодействует с вами с прошлого месяца, но через библиотеки Python. Мы оба были бы очень признательны, если бы вы сообщили нам об источниках или ссылках, где мы можем просмотреть эти библиотеки и службы. заранее спасибо - person Akhil Reddy; 14.02.2017
comment
Ахил, пожалуйста, см. раздел Получить цены на товары (стандартные) для места для хранения производительности в моем ответе. - person Ruber Cuellar Valenzuela; 14.02.2017
comment
Конечно, я могу предоставить ссылки с некоторыми примерами, здесь, в go: softlayer.github .io/go Python: softlayer.github.io/python Также рекомендую ознакомиться с примерами на гитхабе: go github. com/softlayer/softlayer-go python github.com/softlayer /softlayer-python - person Ruber Cuellar Valenzuela; 14.02.2017
comment
Есть несколько примеров, но если у вас есть проблема или сомнения. Не стесняйтесь спрашивать, я буду рад, что вы поможете вам - person Ruber Cuellar Valenzuela; 14.02.2017
comment
Привет Рубер, Спасибо за помощь. Можно ли сделать API-вызовы softlayer обычным http-запросом в golang. - person Akhil Reddy; 16.02.2017
comment
Вы хотите сказать, что похожий звонок, как отдых? или изменить конечную точку? - person Ruber Cuellar Valenzuela; 16.02.2017
comment
Сделайте аналогичный вызов rest API без использования библиотеки softlayer go. - person Akhil Reddy; 16.02.2017
comment
Пожалуйста, просмотрите раздел SoftLayer_Account/getObject без использования softlayer-go в моем ответе, надеюсь, это поможет :) - person Ruber Cuellar Valenzuela; 16.02.2017
comment
Можем ли мы сделать почтовый запрос, передав параметры, а также предоставив фильтр объекта и маску - person Akhil Reddy; 17.02.2017
comment
Хороший вопрос, просмотрите мой последний ответ, пожалуйста - person Ruber Cuellar Valenzuela; 17.02.2017
comment
Привет Рубер. У одного из моих друзей есть сомнения относительно SL, как определить, какой трафик приходит на конкретный виртуальный сервер и как узнать, из какого источника идет трафик, я также хотел бы знать тип трафика, который приходит. какие API-интерфейсы Python SoftLayer следует использовать для получения этой информации? Заранее спасибо. - person Akhil Reddy; 27.02.2017
comment
Прошу прощения, в API нет ничего, чтобы получить информацию о том, какой трафик или источник из него можно использовать tcpdump: tcpdump.org/tcpdump_man.html - person Ruber Cuellar Valenzuela; 01.03.2017
comment
Привет Рубер. Я попытался использовать метод cancelServiceOnAnniversaryDate() для отмены хранения блоков и файлов, но он выдает ошибку, что такие службы не могут быть отменены с помощью этого метода. Как отменить хранение с помощью метода cancelServiceOnAnniversaryDate() - person Akhil Reddy; 10.04.2017
comment
К сожалению, метод SoftLayer_Billing_Item::cancelServiceOnAnniversaryDate не работает для некоторых служб, пожалуйста, попробуйте запрос, который я разместил здесь: Как отменить только пространство для моментального снимка? , вам нужно только изменить флаг: immediateCancellationFlag на false - person Ruber Cuellar Valenzuela; 11.04.2017
comment
Спасибо. Отменит ли указанный выше запрос хранение в годовщину или отменит немедленно. - person Akhil Reddy; 11.04.2017
comment
Если вы установите immediateCancellationFlag: true, служба будет немедленно отменена, если вы установите immediateCancellationFlag: false, она будет отменена в годовщину - person Ruber Cuellar Valenzuela; 11.04.2017
comment
Привет Рубер. Есть ли способ авторизовать подсети для блочного хранилища вместо авторизации виртуальных гостей, как мы делаем для хранилища файлов, где мы авторизуем подсети? - person Akhil Reddy; 25.04.2017
comment
Добавлять подсети нельзя, можно только добавлять устройства (BMS/VS) и IP-адреса для блочного хранилища. Приносим извинения за неудобства. Дайте мне знать, если вам нужна дополнительная помощь - person Ruber Cuellar Valenzuela; 25.04.2017