@ -155,6 +155,32 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
}
}
}
}
createReqPPC . Interfaces = make ( [ ] kvmppc . Interface , 0 )
if networks , ok := d . GetOk ( "network" ) ; ok {
if networks . ( * schema . Set ) . Len ( ) > 0 {
ns := networks . ( * schema . Set ) . List ( )
interfaces := make ( [ ] kvmppc . Interface , 0 )
for _ , elem := range ns {
netInterfaceVal := elem . ( map [ string ] interface { } )
reqInterface := kvmppc . Interface {
NetType : netInterfaceVal [ "net_type" ] . ( string ) ,
NetID : uint64 ( netInterfaceVal [ "net_id" ] . ( int ) ) ,
}
ipaddr , ipSet := netInterfaceVal [ "ip_address" ]
if ipSet {
reqInterface . IPAddr = ipaddr . ( string )
}
interfaces = append ( interfaces , reqInterface )
}
createReqPPC . Interfaces = interfaces
}
}
argVal , ok = d . GetOk ( "cloud_init" )
argVal , ok = d . GetOk ( "cloud_init" )
if ok {
if ok {
userdata := argVal . ( string )
userdata := argVal . ( string )
@ -242,45 +268,6 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
}
}
}
}
// Note bene: we created compute in a STOPPED state (this is required to properly attach 1st network interface),
// now we need to start it before we report the sequence complete
if d . Get ( "started" ) . ( bool ) {
req := compute . StartRequest { ComputeID : computeId }
log . Debugf ( "resourceComputeCreate: starting Compute ID %d after completing its resource configuration" , computeId )
if _ , err := c . CloudAPI ( ) . Compute ( ) . Start ( ctx , req ) ; err != nil {
warnings . Add ( err )
}
}
if enabled , ok := d . GetOk ( "enabled" ) ; ok {
if enabled . ( bool ) {
req := compute . EnableRequest { ComputeID : computeId }
log . Debugf ( "resourceComputeCreate: enable=%t Compute ID %d after completing its resource configuration" , enabled , computeId )
if _ , err := c . CloudAPI ( ) . Compute ( ) . Enable ( ctx , req ) ; err != nil {
warnings . Add ( err )
}
} else {
req := compute . DisableRequest { ComputeID : computeId }
log . Debugf ( "resourceComputeCreate: enable=%t Compute ID %d after completing its resource configuration" , enabled , computeId )
if _ , err := c . CloudAPI ( ) . Compute ( ) . Disable ( ctx , req ) ; err != nil {
warnings . Add ( err )
}
}
}
if ! cleanup {
if affinityLabel , ok := d . GetOk ( "affinity_label" ) ; ok {
req := compute . AffinityLabelSetRequest {
ComputeID : computeId ,
AffinityLabel : affinityLabel . ( string ) ,
}
_ , err := c . CloudAPI ( ) . Compute ( ) . AffinityLabelSet ( ctx , req )
if err != nil {
warnings . Add ( err )
}
}
if disks , ok := d . GetOk ( "disks" ) ; ok {
if disks , ok := d . GetOk ( "disks" ) ; ok {
log . Debugf ( "resourceComputeCreate: Create disks on ComputeID: %d" , computeId )
log . Debugf ( "resourceComputeCreate: Create disks on ComputeID: %d" , computeId )
addedDisks := disks . ( [ ] interface { } )
addedDisks := disks . ( [ ] interface { } )
@ -291,9 +278,11 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
ComputeID : computeId ,
ComputeID : computeId ,
DiskName : diskConv [ "disk_name" ] . ( string ) ,
DiskName : diskConv [ "disk_name" ] . ( string ) ,
Size : uint64 ( diskConv [ "size" ] . ( int ) ) ,
Size : uint64 ( diskConv [ "size" ] . ( int ) ) ,
SepID : uint64 ( diskConv [ "sep_id" ] . ( int ) ) ,
}
}
if diskConv [ "sep_id" ] . ( int ) != 0 {
req . SepID = uint64 ( diskConv [ "sep_id" ] . ( int ) )
}
if diskConv [ "disk_type" ] . ( string ) != "" {
if diskConv [ "disk_type" ] . ( string ) != "" {
req . DiskType = diskConv [ "disk_type" ] . ( string )
req . DiskType = diskConv [ "disk_type" ] . ( string )
}
}
@ -316,6 +305,54 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
}
}
}
}
if ! cleanup {
if enabled , ok := d . GetOk ( "enabled" ) ; ok {
if enabled . ( bool ) {
req := compute . EnableRequest { ComputeID : computeId }
log . Debugf ( "resourceComputeCreate: enable=%t Compute ID %d after completing its resource configuration" , enabled , computeId )
if _ , err := c . CloudAPI ( ) . Compute ( ) . Enable ( ctx , req ) ; err != nil {
warnings . Add ( err )
}
} else {
req := compute . DisableRequest { ComputeID : computeId }
log . Debugf ( "resourceComputeCreate: enable=%t Compute ID %d after completing its resource configuration" , enabled , computeId )
if _ , err := c . CloudAPI ( ) . Compute ( ) . Disable ( ctx , req ) ; err != nil {
warnings . Add ( err )
}
}
}
// Note bene: we created compute in a STOPPED state (this is required to properly attach 1st network interface),
// now we need to start it before we report the sequence complete
if start , ok := d . GetOk ( "started" ) ; ok {
if start . ( bool ) {
req := compute . StartRequest { ComputeID : computeId }
log . Debugf ( "resourceComputeCreate: starting Compute ID %d after completing its resource configuration" , computeId )
if _ , err := c . CloudAPI ( ) . Compute ( ) . Start ( ctx , req ) ; err != nil {
warnings . Add ( err )
}
}
if ! start . ( bool ) {
req := compute . StopRequest { ComputeID : computeId }
log . Debugf ( "resourceComputeCreate: stoping Compute ID %d after completing its resource configuration" , computeId )
if _ , err := c . CloudAPI ( ) . Compute ( ) . Stop ( ctx , req ) ; err != nil {
warnings . Add ( err )
}
}
}
if affinityLabel , ok := d . GetOk ( "affinity_label" ) ; ok {
req := compute . AffinityLabelSetRequest {
ComputeID : computeId ,
AffinityLabel : affinityLabel . ( string ) ,
}
_ , err := c . CloudAPI ( ) . Compute ( ) . AffinityLabelSet ( ctx , req )
if err != nil {
warnings . Add ( err )
}
}
if ars , ok := d . GetOk ( "affinity_rules" ) ; ok {
if ars , ok := d . GetOk ( "affinity_rules" ) ; ok {
log . Debugf ( "resourceComputeCreate: Create affinity rules on ComputeID: %d" , computeId )
log . Debugf ( "resourceComputeCreate: Create affinity rules on ComputeID: %d" , computeId )
addedAR := ars . ( [ ] interface { } )
addedAR := ars . ( [ ] interface { } )
@ -361,7 +398,6 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
}
}
}
}
}
}
}
if tags , ok := d . GetOk ( "tags" ) ; ok {
if tags , ok := d . GetOk ( "tags" ) ; ok {
log . Debugf ( "resourceComputeCreate: Create tags on ComputeID: %d" , computeId )
log . Debugf ( "resourceComputeCreate: Create tags on ComputeID: %d" , computeId )
@ -392,10 +428,12 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
req := compute . PFWAddRequest {
req := compute . PFWAddRequest {
ComputeID : computeId ,
ComputeID : computeId ,
PublicPortStart : uint64 ( pfwItem [ "public_port_start" ] . ( int ) ) ,
PublicPortStart : uint64 ( pfwItem [ "public_port_start" ] . ( int ) ) ,
PublicPortEnd : int64 ( pfwItem [ "public_port_end" ] . ( int ) ) ,
LocalBasePort : uint64 ( pfwItem [ "local_port" ] . ( int ) ) ,
LocalBasePort : uint64 ( pfwItem [ "local_port" ] . ( int ) ) ,
Proto : pfwItem [ "proto" ] . ( string ) ,
Proto : pfwItem [ "proto" ] . ( string ) ,
}
}
if pfwItem [ "public_port_end" ] . ( int ) != 0 {
req . PublicPortEnd = int64 ( pfwItem [ "public_port_end" ] . ( int ) )
}
_ , err := c . CloudAPI ( ) . Compute ( ) . PFWAdd ( ctx , req )
_ , err := c . CloudAPI ( ) . Compute ( ) . PFWAdd ( ctx , req )
if err != nil {
if err != nil {
@ -404,6 +442,7 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
}
}
}
}
}
}
if userAcess , ok := d . GetOk ( "user_access" ) ; ok {
if userAcess , ok := d . GetOk ( "user_access" ) ; ok {
log . Debugf ( "resourceComputeCreate: Create user access on ComputeID: %d" , computeId )
log . Debugf ( "resourceComputeCreate: Create user access on ComputeID: %d" , computeId )
usersAcess := userAcess . ( * schema . Set ) . List ( )
usersAcess := userAcess . ( * schema . Set ) . List ( )
@ -460,7 +499,7 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
}
}
}
}
if d . Get ( "pin_to_stack" ) . ( bool ) == true {
if d . Get ( "pin_to_stack" ) . ( bool ) {
req := compute . PinToStackRequest {
req := compute . PinToStackRequest {
ComputeID : computeId ,
ComputeID : computeId ,
}
}
@ -470,7 +509,7 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
}
}
}
}
if d . Get ( "pause" ) . ( bool ) == true {
if d . Get ( "pause" ) . ( bool ) {
req := compute . PauseRequest {
req := compute . PauseRequest {
ComputeID : computeId ,
ComputeID : computeId ,
}
}
@ -479,15 +518,14 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
warnings . Add ( err )
warnings . Add ( err )
}
}
}
}
}
log . Debugf ( "resourceComputeCreate: new Compute ID %d, name %s creation sequence complete" , computeId , d . Get ( "name" ) . ( string ) )
log . Debugf ( "resourceComputeCreate: new Compute ID %d, name %s creation sequence complete" , computeId , d . Get ( "name" ) . ( string ) )
// We may reuse dataSourceComputeRead here as we maintain similarity
// We may reuse dataSourceComputeRead here as we maintain similarity
// between Compute resource and Compute data source schemas
// between Compute resource and Compute data source schemas
// Compute read function will also update resource ID on success, so that Terraform
// Compute read function will also update resource ID on success, so that Terraform
// will know the resource exists
// will know the resource exists
defer resourceComputeRead ( ctx , d , m )
return append ( warnings . Get ( ) , resourceComputeRead ( ctx , d , m ) ... )
return warnings . Get ( )
}
}
func resourceComputeRead ( ctx context . Context , d * schema . ResourceData , m interface { } ) diag . Diagnostics {
func resourceComputeRead ( ctx context . Context , d * schema . ResourceData , m interface { } ) diag . Diagnostics {
@ -498,6 +536,7 @@ func resourceComputeRead(ctx context.Context, d *schema.ResourceData, m interfac
computeRec , err := utilityComputeCheckPresence ( ctx , d , m )
computeRec , err := utilityComputeCheckPresence ( ctx , d , m )
if err != nil {
if err != nil {
d . SetId ( "" )
return diag . FromErr ( err )
return diag . FromErr ( err )
}
}
@ -601,44 +640,55 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
return diag . FromErr ( err )
return diag . FromErr ( err )
}
}
if d . HasChange ( "enabled" ) {
hasChanged := false
enabled := d . Get ( "enabled" ) . ( bool )
if enabled {
req := compute . EnableRequest {
ComputeID : computeRec . ID ,
}
if _ , err := c . CloudAPI ( ) . Compute ( ) . Enable ( ctx , req ) ; err != nil {
// check compute statuses
switch computeRec . Status {
case status . Deleted :
if restore , ok := d . GetOk ( "restore" ) ; ok && restore . ( bool ) {
restoreReq := compute . RestoreRequest { ComputeID : computeRec . ID }
_ , err := c . CloudAPI ( ) . Compute ( ) . Restore ( ctx , restoreReq )
if err != nil {
d . SetId ( "" )
return diag . FromErr ( err )
return diag . FromErr ( err )
}
}
} else {
req := compute . DisableRequest {
ComputeID : computeRec . ID ,
}
}
if _ , err := c . CloudAPI ( ) . Compute ( ) . Disable ( ctx , req ) ; err != nil {
if enabled , ok := d . GetOk ( "enabled" ) ; ok {
if enabled . ( bool ) {
enableReq := compute . EnableRequest { ComputeID : computeRec . ID }
_ , err = c . CloudAPI ( ) . Compute ( ) . Enable ( ctx , enableReq )
if err != nil {
return diag . FromErr ( err )
}
}
if ! enabled . ( bool ) {
enableReq := compute . DisableRequest { ComputeID : computeRec . ID }
_ , err = c . CloudAPI ( ) . Compute ( ) . Disable ( ctx , enableReq )
if err != nil {
return diag . FromErr ( err )
return diag . FromErr ( err )
}
}
}
}
log . Debugf ( "resourceComputeUpdate: enable=%s Compute ID %v after completing its resource configuration" , d . Id ( ) , enabled )
}
}
// check compute statuses
if start , ok := d . GetOk ( "started" ) ; ok {
switch computeRec . Status {
if start . ( bool ) {
case status . Deleted :
req := compute . StartRequest { ComputeID : computeRec . ID }
restoreReq := compute . RestoreRequest { ComputeID : computeRec . ID }
enableReq := compute . EnableRequest { ComputeID : computeRec . ID }
_ , err := c . CloudAPI ( ) . Compute ( ) . Restore ( ctx , restoreReq )
if _ , err := c . CloudAPI ( ) . Compute ( ) . Start ( ctx , req ) ; err != nil {
if err != nil {
return diag . FromErr ( err )
return diag . FromErr ( err )
}
}
}
if ! start . ( bool ) {
req := compute . StopRequest { ComputeID : computeRec . ID }
_ , err = c . CloudAPI ( ) . Compute ( ) . Enable ( ctx , enableReq )
if _ , err := c . CloudAPI ( ) . Compute ( ) . Stop ( ctx , req ) ; err != nil {
if err != nil {
return diag . FromErr ( err )
return diag . FromErr ( err )
}
}
}
}
hasChanged = true
case status . Destroyed :
case status . Destroyed :
d . SetId ( "" )
d . SetId ( "" )
return diag . Errorf ( "The resource cannot be updated because it has been destroyed" )
return diag . Errorf ( "The resource cannot be updated because it has been destroyed" )
@ -653,6 +703,53 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
return diag . Errorf ( "The compute is in status: %s, please, contant the support for more information" , computeRec . Status )
return diag . Errorf ( "The compute is in status: %s, please, contant the support for more information" , computeRec . Status )
}
}
if hasChanged {
computeRec , err = utilityComputeCheckPresence ( ctx , d , m )
if err != nil {
return diag . FromErr ( err )
}
}
if d . HasChange ( "enabled" ) {
enabled := d . Get ( "enabled" ) . ( bool )
if enabled {
req := compute . EnableRequest {
ComputeID : computeRec . ID ,
}
if _ , err := c . CloudAPI ( ) . Compute ( ) . Enable ( ctx , req ) ; err != nil {
return diag . FromErr ( err )
}
} else {
req := compute . DisableRequest {
ComputeID : computeRec . ID ,
}
if _ , err := c . CloudAPI ( ) . Compute ( ) . Disable ( ctx , req ) ; err != nil {
return diag . FromErr ( err )
}
}
log . Debugf ( "resourceComputeUpdate: enable=%s Compute ID %v after completing its resource configuration" , d . Id ( ) , enabled )
}
if d . HasChange ( "started" ) {
start := d . Get ( "started" ) . ( bool )
if start {
req := compute . StartRequest { ComputeID : computeRec . ID }
if _ , err := c . CloudAPI ( ) . Compute ( ) . Start ( ctx , req ) ; err != nil {
return diag . FromErr ( err )
}
}
if ! start {
req := compute . StopRequest { ComputeID : computeRec . ID }
if _ , err := c . CloudAPI ( ) . Compute ( ) . Stop ( ctx , req ) ; err != nil {
return diag . FromErr ( err )
}
}
}
doUpdate := false
doUpdate := false
resizeReq := compute . ResizeRequest {
resizeReq := compute . ResizeRequest {
ComputeID : computeRec . ID ,
ComputeID : computeRec . ID ,
@ -729,14 +826,16 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
}
}
}
}
if d . HasChange ( "description" ) || d . HasChange ( "name" ) {
if d . HasChange s( "description" , "name" ) {
req := compute . UpdateRequest {
req := compute . UpdateRequest {
ComputeID : computeRec . ID ,
ComputeID : computeRec . ID ,
Name : d . Get ( "name" ) . ( string ) ,
}
}
if desc , ok := d . GetOk ( "description" ) ; ok {
if d . HasChange ( "name" ) {
req . Description = desc . ( string )
req . Name = d . Get ( "name" ) . ( string )
}
if d . HasChange ( "description" ) {
req . Description = d . Get ( "description" ) . ( string )
}
}
if _ , err := c . CloudAPI ( ) . Compute ( ) . Update ( ctx , req ) ; err != nil {
if _ , err := c . CloudAPI ( ) . Compute ( ) . Update ( ctx , req ) ; err != nil {
@ -835,9 +934,11 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
ComputeID : computeRec . ID ,
ComputeID : computeRec . ID ,
DiskName : diskConv [ "disk_name" ] . ( string ) ,
DiskName : diskConv [ "disk_name" ] . ( string ) ,
Size : uint64 ( diskConv [ "size" ] . ( int ) ) ,
Size : uint64 ( diskConv [ "size" ] . ( int ) ) ,
SepID : uint64 ( diskConv [ "sep_id" ] . ( int ) ) ,
}
}
if diskConv [ "sep_id" ] . ( int ) != 0 {
req . SepID = uint64 ( diskConv [ "sep_id" ] . ( int ) )
}
if diskConv [ "disk_type" ] . ( string ) != "" {
if diskConv [ "disk_type" ] . ( string ) != "" {
req . DiskType = diskConv [ "disk_type" ] . ( string )
req . DiskType = diskConv [ "disk_type" ] . ( string )
}
}
@ -1267,7 +1368,7 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
if d . HasChange ( "pin_to_stack" ) {
if d . HasChange ( "pin_to_stack" ) {
oldPin , newPin := d . GetChange ( "pin_to_stack" )
oldPin , newPin := d . GetChange ( "pin_to_stack" )
if oldPin . ( bool ) == true && newPin . ( bool ) == false {
if ! newPin . ( bool ) {
req := compute . UnpinFromStackRequest {
req := compute . UnpinFromStackRequest {
ComputeID : computeRec . ID ,
ComputeID : computeRec . ID ,
}
}
@ -1277,7 +1378,7 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
return diag . FromErr ( err )
return diag . FromErr ( err )
}
}
}
}
if oldPin . ( bool ) == false && newPin . ( bool ) == true {
if ! oldPin . ( bool ) {
req := compute . PinToStackRequest {
req := compute . PinToStackRequest {
ComputeID : computeRec . ID ,
ComputeID : computeRec . ID ,
}
}
@ -1291,7 +1392,7 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
if d . HasChange ( "pause" ) {
if d . HasChange ( "pause" ) {
oldPause , newPause := d . GetChange ( "pause" )
oldPause , newPause := d . GetChange ( "pause" )
if oldPause . ( bool ) == true && newPause . ( bool ) == false {
if ! newPause . ( bool ) {
req := compute . ResumeRequest {
req := compute . ResumeRequest {
ComputeID : computeRec . ID ,
ComputeID : computeRec . ID ,
}
}
@ -1300,7 +1401,7 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
return diag . FromErr ( err )
return diag . FromErr ( err )
}
}
}
}
if oldPause . ( bool ) == false && newPause . ( bool ) == true {
if ! oldPause . ( bool ) {
req := compute . PauseRequest {
req := compute . PauseRequest {
ComputeID : computeRec . ID ,
ComputeID : computeRec . ID ,
}
}
@ -1313,8 +1414,8 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
}
}
if d . HasChange ( "reset" ) {
if d . HasChange ( "reset" ) {
oldReset , newReset := d . GetChange ( "reset" )
_ , newReset := d . GetChange ( "reset" )
if oldReset. ( bool ) == false && newReset. ( bool ) == true {
if newReset. ( bool ) {
req := compute . ResetRequest {
req := compute . ResetRequest {
ComputeID : computeRec . ID ,
ComputeID : computeRec . ID ,
}
}
@ -1394,8 +1495,8 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
// we may reuse dataSourceComputeRead here as we maintain similarity
// we may reuse dataSourceComputeRead here as we maintain similarity
// between Compute resource and Compute data source schemas
// between Compute resource and Compute data source schemas
defer resourceComputeRead ( ctx , d , m )
return warnings . Get ( )
return append ( warnings . Get ( ) , resourceComputeRead ( ctx , d , m ) ... )
}
}
func isChangeDisk ( els [ ] interface { } , el interface { } ) bool {
func isChangeDisk ( els [ ] interface { } , el interface { } ) bool {
@ -1456,6 +1557,8 @@ func resourceComputeDelete(ctx context.Context, d *schema.ResourceData, m interf
return diag . FromErr ( err )
return diag . FromErr ( err )
}
}
d . SetId ( "" )
return nil
return nil
}
}
@ -1504,7 +1607,6 @@ func disksSubresourceSchemaMake() map[string]*schema.Schema {
} ,
} ,
"permanently" : {
"permanently" : {
Type : schema . TypeBool ,
Type : schema . TypeBool ,
Computed : true ,
Optional : true ,
Optional : true ,
Description : "Disk deletion status" ,
Description : "Disk deletion status" ,
} ,
} ,
@ -1877,6 +1979,12 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema {
Default : false ,
Default : false ,
} ,
} ,
"restore" : {
Type : schema . TypeBool ,
Optional : true ,
Default : false ,
} ,
"auto_start" : {
"auto_start" : {
Type : schema . TypeBool ,
Type : schema . TypeBool ,
Optional : true ,
Optional : true ,