mirror of https://github.com/kubernetes/kops.git
				
				
				
			Delete route tables, even if untagged, if we are deleting the VPC
The route table cannot exist without a VPC; if we're deleting the VPC we must delete the route table also. This will help fix problems when we fail to tag the route-table. Issue #597
This commit is contained in:
		
							parent
							
								
									df9efe6591
								
							
						
					
					
						commit
						ba8514d840
					
				|  | @ -164,6 +164,45 @@ func (c *DeleteCluster) ListResources() (map[string]*ResourceTracker, error) { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	{ | ||||||
|  | 		// We sometimes have trouble tagging the route table (eventual consistency, e.g. #597)
 | ||||||
|  | 		// If we are deleting the VPC, we should delete the route table
 | ||||||
|  | 		// (no real reason not to; easy to recreate; no real state etc)
 | ||||||
|  | 		routeTables, err := DescribeRouteTablesIgnoreTags(cloud) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		for _, rt := range routeTables { | ||||||
|  | 			rtID := aws.StringValue(rt.RouteTableId) | ||||||
|  | 			vpcID := aws.StringValue(rt.VpcId) | ||||||
|  | 			if vpcID == "" || rtID == "" { | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if resources["vpc:"+vpcID] == nil { | ||||||
|  | 				// Not deleting this VPC; ignore
 | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			isMain := true | ||||||
|  | 			for _, a := range rt.Associations { | ||||||
|  | 				if aws.BoolValue(a.Main) == false { | ||||||
|  | 					isMain = false | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			if isMain { | ||||||
|  | 				glog.V(4).Infof("ignoring main routetable %q", rtID) | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			t := buildTrackerForRouteTable(rt) | ||||||
|  | 			if resources[t.Type+":"+t.ID] == nil { | ||||||
|  | 				resources[t.Type+":"+t.ID] = t | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	for k, t := range resources { | 	for k, t := range resources { | ||||||
| 		if t.done { | 		if t.done { | ||||||
| 			delete(resources, k) | 			delete(resources, k) | ||||||
|  | @ -801,6 +840,36 @@ func DeleteRouteTable(cloud fi.Cloud, r *ResourceTracker) error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // DescribeRouteTablesIgnoreTags returns all ec2.RouteTable, ignoring tags
 | ||||||
|  | func DescribeRouteTablesIgnoreTags(cloud fi.Cloud) ([]*ec2.RouteTable, error) { | ||||||
|  | 	c := cloud.(awsup.AWSCloud) | ||||||
|  | 
 | ||||||
|  | 	glog.V(2).Infof("Listing all RouteTables") | ||||||
|  | 	request := &ec2.DescribeRouteTablesInput{} | ||||||
|  | 	response, err := c.EC2().DescribeRouteTables(request) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, fmt.Errorf("error listing RouteTables: %v", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return response.RouteTables, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DescribeRouteTables lists route-tables tagged for the cloud
 | ||||||
|  | func DescribeRouteTables(cloud fi.Cloud) ([]*ec2.RouteTable, error) { | ||||||
|  | 	c := cloud.(awsup.AWSCloud) | ||||||
|  | 
 | ||||||
|  | 	glog.V(2).Infof("Listing EC2 RouteTables") | ||||||
|  | 	request := &ec2.DescribeRouteTablesInput{ | ||||||
|  | 		Filters: buildEC2Filters(cloud), | ||||||
|  | 	} | ||||||
|  | 	response, err := c.EC2().DescribeRouteTables(request) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, fmt.Errorf("error listing RouteTables: %v", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return response.RouteTables, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func ListRouteTables(cloud fi.Cloud, clusterName string) ([]*ResourceTracker, error) { | func ListRouteTables(cloud fi.Cloud, clusterName string) ([]*ResourceTracker, error) { | ||||||
| 	routeTables, err := DescribeRouteTables(cloud) | 	routeTables, err := DescribeRouteTables(cloud) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | @ -810,6 +879,14 @@ func ListRouteTables(cloud fi.Cloud, clusterName string) ([]*ResourceTracker, er | ||||||
| 	var trackers []*ResourceTracker | 	var trackers []*ResourceTracker | ||||||
| 
 | 
 | ||||||
| 	for _, rt := range routeTables { | 	for _, rt := range routeTables { | ||||||
|  | 		tracker := buildTrackerForRouteTable(rt) | ||||||
|  | 		trackers = append(trackers, tracker) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return trackers, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func buildTrackerForRouteTable(rt *ec2.RouteTable) *ResourceTracker { | ||||||
| 	tracker := &ResourceTracker{ | 	tracker := &ResourceTracker{ | ||||||
| 		Name:    FindName(rt.Tags), | 		Name:    FindName(rt.Tags), | ||||||
| 		ID:      aws.StringValue(rt.RouteTableId), | 		ID:      aws.StringValue(rt.RouteTableId), | ||||||
|  | @ -829,25 +906,7 @@ func ListRouteTables(cloud fi.Cloud, clusterName string) ([]*ResourceTracker, er | ||||||
| 	tracker.blocks = blocks | 	tracker.blocks = blocks | ||||||
| 	tracker.blocked = blocked | 	tracker.blocked = blocked | ||||||
| 
 | 
 | ||||||
| 		trackers = append(trackers, tracker) | 	return tracker | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return trackers, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func DescribeRouteTables(cloud fi.Cloud) ([]*ec2.RouteTable, error) { |  | ||||||
| 	c := cloud.(awsup.AWSCloud) |  | ||||||
| 
 |  | ||||||
| 	glog.V(2).Infof("Listing EC2 RouteTables") |  | ||||||
| 	request := &ec2.DescribeRouteTablesInput{ |  | ||||||
| 		Filters: buildEC2Filters(cloud), |  | ||||||
| 	} |  | ||||||
| 	response, err := c.EC2().DescribeRouteTables(request) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, fmt.Errorf("error listing RouteTables: %v", err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return response.RouteTables, nil |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func DeleteDhcpOptions(cloud fi.Cloud, r *ResourceTracker) error { | func DeleteDhcpOptions(cloud fi.Cloud, r *ResourceTracker) error { | ||||||
|  | @ -1065,7 +1124,7 @@ func DeleteVPC(cloud fi.Cloud, r *ResourceTracker) error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func ListVPCs(cloud fi.Cloud, clusterName string) ([]*ResourceTracker, error) { | func DescribeVPCs(cloud fi.Cloud) ([]*ec2.Vpc, error) { | ||||||
| 	c := cloud.(awsup.AWSCloud) | 	c := cloud.(awsup.AWSCloud) | ||||||
| 
 | 
 | ||||||
| 	glog.V(2).Infof("Listing EC2 VPC") | 	glog.V(2).Infof("Listing EC2 VPC") | ||||||
|  | @ -1077,9 +1136,17 @@ func ListVPCs(cloud fi.Cloud, clusterName string) ([]*ResourceTracker, error) { | ||||||
| 		return nil, fmt.Errorf("error listing VPCs: %v", err) | 		return nil, fmt.Errorf("error listing VPCs: %v", err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var trackers []*ResourceTracker | 	return response.Vpcs, nil | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| 	for _, v := range response.Vpcs { | func ListVPCs(cloud fi.Cloud, clusterName string) ([]*ResourceTracker, error) { | ||||||
|  | 	vpcs, err := DescribeVPCs(cloud) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var trackers []*ResourceTracker | ||||||
|  | 	for _, v := range vpcs { | ||||||
| 		tracker := &ResourceTracker{ | 		tracker := &ResourceTracker{ | ||||||
| 			Name:    FindName(v.Tags), | 			Name:    FindName(v.Tags), | ||||||
| 			ID:      aws.StringValue(v.VpcId), | 			ID:      aws.StringValue(v.VpcId), | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue