Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GCE: Add Alpha feature "Network Tiers" for external L4 load balancers #51301

Merged
merged 1 commit into from
Sep 3, 2017

Conversation

yujuhong
Copy link
Contributor

@yujuhong yujuhong commented Aug 25, 2017

Special notes for your reviewer:
The PR has been manually tested in a GCE e2e cluster for the following conditions:

  1. When network-tier is not enabled in gce.conf, network tier annotations are completely ignored by the controller.
  2. When network-tier is enabled in gce.conf:
    • Service w/ Standard tier: create a standard-tier LB.
    • Update Service to use a different tier: tear down the existing forwarding rule and release the IP before creating a new LB.
    • Service w/ an invalid tier value: ensureExternalLoadBalancer() returns an error, and controller emits an event.
    • Service w/ a user-owned static IP: check if the tier matches, if not, returns an error and emits an event.

I uploaded an e2e test #51483. You're welcome to review that one too.

Release note:

GCE: Service object now supports "Network Tiers" as an Alpha feature via annotations.

@yujuhong yujuhong added the release-note Denotes a PR that will be considered when it comes time to generate release notes. label Aug 25, 2017
@k8s-ci-robot k8s-ci-robot added size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. labels Aug 25, 2017
@yujuhong
Copy link
Contributor Author

@nicksardo @bowei I split the changes into multiple commits so that it'd be easier to review. If you prefer multiple PRs, let me know.

@k8s-github-robot k8s-github-robot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Aug 25, 2017
@k8s-github-robot k8s-github-robot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Aug 25, 2017
if _, exists := cas.addrsByRegionAndName[region][name]; !exists {
return makeGoogleAPINotFoundError("")
}
delete(cas.addrsByRegionAndName[region], name)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

delete(cas.reservedAddrs, addr.Address)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in the new commit.

if isNotFound(err) {
return nil
}
if err != nil {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: else if

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.


// reconcileFwdRuleNetworkTiers check the network tiers of existing forwarding
// rule and delete the rule if the tier does not matched the desired tier.
func reconcileFwdRuleNetworkTiers(s CloudForwardingRuleService, region, name, lbRef string, desiredNetTier NetworkTier) error {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using the word reconcile seems strange to me here because you're only deleting the forwarding rule/address if the tier needs changed.

I suggest wripping the two reconcile funcs apart and introduce a higher level func which checks tier equality and deletes the resources if necessary.

func deleteWrongNetworkTieredResources(...){ 
  fwdRuleOk, err := fwdRuleNetworkTierEquals(gce, region, name, lbRef, desiredNetTier)
  if err!= nil {
...
} 
if !fwdRuleOk {
  err = s.DeleteRegionForwardingRule(name, region)
}

 addrOk, err := addressNetworkTierEquals(gce, region, name, lbRef, desiredNetTier)
  if err!= nil {
...
} 
if !addrOk {
  err = s.DeleteRegionAddress(name, region)
}

}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree that the names are confusing. The function was initially intended to do more, but that didn't pan out.
Renamed the functions. I still keep the address and forwarding rule verification in two functions to make testing easier.

@k8s-github-robot k8s-github-robot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Aug 29, 2017
@k8s-github-robot k8s-github-robot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Aug 29, 2017
Copy link
Contributor Author

@yujuhong yujuhong left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed comments. Thanks!

if _, exists := cas.addrsByRegionAndName[region][name]; !exists {
return makeGoogleAPINotFoundError("")
}
delete(cas.addrsByRegionAndName[region], name)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in the new commit.

if isNotFound(err) {
return nil
}
if err != nil {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.


// reconcileFwdRuleNetworkTiers check the network tiers of existing forwarding
// rule and delete the rule if the tier does not matched the desired tier.
func reconcileFwdRuleNetworkTiers(s CloudForwardingRuleService, region, name, lbRef string, desiredNetTier NetworkTier) error {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree that the names are confusing. The function was initially intended to do more, but that didn't pan out.
Renamed the functions. I still keep the address and forwarding rule verification in two functions to make testing easier.

addressObj.Address = existingIP
}
if err = s.ReserveRegionAddress(addressObj, region); err != nil {
if !isHTTPErrorCode(err, http.StatusConflict) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or BadRequest

addressObj.Address = existingIP
}
if err = s.ReserveAlphaRegionAddress(addressObj, region); err != nil {
if !isHTTPErrorCode(err, http.StatusConflict) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or BadRequest

@nicksardo
Copy link
Contributor

I don't see anything wrong with it, though we should get another pair of eyes. @bowei @MrHohn ?

@yujuhong yujuhong added this to the v1.8 milestone Aug 29, 2017
@yujuhong
Copy link
Contributor Author

Flakes caused by #51379

/retest

@yujuhong
Copy link
Contributor Author

/test pull-kubernetes-e2e-gce-bazel

Copy link
Member

@MrHohn MrHohn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good and logic makes sense to me.

Couple minor comments.

// NetworkTierAnnotationKey is annotated on a Service object to indicate which
// network tier a GCP LB should use. The valid values are "Standard" and
// "Premium" (default).
NetworkTierAnnotationKey = "cloud.google.com/network-tier"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to specify alpha in the key? I forgot the reason... @nicksardo

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can't find it but I think it's recommended not to use alpha in the annotation anymore.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good question. I suggest double checking with thockin.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/cc @thockin

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Spoke to @thockin offline. This is ok.

glog.Infof("EnsureLoadBalancer(%v(%v)): creating forwarding rule, IP %s", loadBalancerName, serviceName, ipAddressToUse)
if err := gce.createForwardingRule(loadBalancerName, serviceName.String(), gce.region, ipAddressToUse, ports); err != nil {
glog.Infof("EnsureLoadBalancer(%v(%v)): creating forwarding rule, IP %s (tier: %s)", loadBalancerName, serviceName, ipAddressToUse, netTier)
if err := createForwardingRule(gce, loadBalancerName, serviceName.String(), gce.region, ipAddressToUse, gce.targetPoolURL(loadBalancerName), ports, netTier); err != nil {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we still call targetPoolURL() in createForwardingRule()? Seems a bit unclean in this way...

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Humm, I see why it is hard, targetPoolURL desires some info from the gce struct but there is no obvious way for CloudForwardingRuleService to expose those. And we need CloudForwardingRuleService for mocking and testing.

Never mind :/

Copy link
Contributor Author

@yujuhong yujuhong Aug 30, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep. I could fix the targetPool code too with more mocking, but I'd prefer leaving them alone for this change.

@@ -84,6 +84,11 @@ func makeBackendServiceDescription(nm types.NamespacedName, shared bool) string

// External Load Balancer

// makeServiceDescription is used to generate descriptions for forwarding rules and addresses.
func makeServiceDescription(serviceName string) string {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe good to name this function in a more consistent way among this file...We already have makeBackendServiceDescription above.

But of course I couldn't think of a better name ATM :(

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we punt this to when we have more than two functions? :-)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we punt this to when we have more than two functions? :-)

SGTM

addressObj.Address = existingIP
}
if err = s.ReserveAlphaRegionAddress(addressObj, region); err != nil {
if !isHTTPErrorCode(err, http.StatusConflict) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

May be cleaner to check error after the switch? Seems like they are the exact same codes.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like checking the err code close to the call site, but sure I'll change it.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

@@ -85,3 +122,54 @@ func TestVerifyRequestedIP(t *testing.T) {
})
}
}

func TestCreateForwardingRule(t *testing.T) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TestCreateForwardingRuleWithTier?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

}
netTier := NetworkTierGCEValueToType(netTierStr)
if netTier != desiredNetTier {
glog.Errorf("verifyUserRequestedIP: requested static IP %q (name: %s) for LB %s has network tier %s, need %s.", requestedIP, existingAddress.Name, lbRef, netTier, desiredNetTier)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tiny nit: s/need/needs

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or does it makes sense to log and return the same error content?

Copy link
Contributor Author

@yujuhong yujuhong Aug 30, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Error will be included in the k8s event and probably should not have too many function-specific information.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Error will be included in the k8s event and probably should not have too many function-specific information.

Good point :)

// Check the current and the desired network tiers. If they do not match,
// tear down the existing resources -- delete the forwarding rule, and
// release the IP.
netTier, err := gce.getServiceNetworkTier(apiService)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we also gate network tier outside of getServiceNetworkTier()? Like reconcileXXXNetworkTiers() below, so that we don't trigger the logic at all.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did that intentionally since getServiceNetworkTier() should always return the default tier if the feature is disabled. If I could, I'd actually prefer gating it only at the gce API calls so that we can reuse the same flow when the feature graduates to Beta. Otherwise, the beta code will be completely new code which needs to be tested all over again. I think the current implementation provides sufficient "gating" but feel free to disagree :-)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Humm...I think I some how mixed the concepts of gating alpha/beta GCE API and gating the actual feature. IMHO:

  • Gate alpha/beta API means no calls to them.
  • Gate the feature means no triggers to the logic.

Given that the GCE provider gate is about gating API but not feature, I think it makes sense to do it this way...

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the current implementation provides sufficient "gating" but feel free to disagree :-)

But yeah technically this is sufficient :)

glog.Errorf("EnsureLoadBalancer(%s): failed to get the desired network tier: %v", lbRefStr, err)
return nil, err
}
glog.V(2).Infof("EnsureLoadBalancer(%s): desired network tier %q ", lbRefStr, netTier)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

User that doesn't enable network tier may be seeing this "network tier" log and they may think it is mistakenly enabled?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bumped it to V(4) so that it doesn't show up in GKE clusters.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for switching side...Actually I'd prefer to keep this in V(2) for better debuggability in case things go wrong in production. (I'd like to feature gate it, or maybe it just doesn't matter)

@@ -991,15 +987,28 @@ func (gce *GCECloud) getServiceNetworkTier(svc *v1.Service) (NetworkTier, error)
return tier, nil
}

// reconcileFwdRuleNetworkTiers check the network tiers of existing forwarding
func (gce *GCECloud) deleteWrongNetworkTieredResources(lbName, lbRef string, desiredNetTier NetworkTier) error {
if !gce.AlphaFeatureGate.Enabled(AlphaFeatureNetworkTiers) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Humm..Seems like the feature gate check is moved inside functions. I think having it outiside may make it clear about what are involved.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Restored it.

@yujuhong
Copy link
Contributor Author

@MrHohn the new commit addressed (most) of your comments.

@nicksardo
Copy link
Contributor

Since you're making the BadRequest/StatusConflict fix in this PR, could you also change the fake service to return the both types.

func (cas *FakeCloudAddressService) ReserveAlphaRegionAddress(addr *computealpha.Address, region string) error {
	if addr.Address == "" {
		addr.Address = fmt.Sprintf("1.2.3.%d", cas.count)
		cas.count++
	}

	if addr.AddressType == "" {
		addr.AddressType = string(schemeExternal)
	}

	if cas.reservedAddrs[addr.Address] {
		msg := "IP in use"
		// Depending on the type of address, different error messages may be returned.
		switch lbScheme(addr.AddressType) {
		case schemeExternal:
			return makeGoogleAPIError(http.StatusBadRequest, msg)
		default:
			return makeGoogleAPIError(http.StatusConflict, msg)
		}
	}

	if _, exists := cas.addrsByRegionAndName[region]; !exists {
		cas.addrsByRegionAndName[region] = make(map[string]*computealpha.Address)
	}

	if _, exists := cas.addrsByRegionAndName[region][addr.Name]; exists {
		return makeGoogleAPIError(http.StatusConflict, "name in use")
	}

	cas.addrsByRegionAndName[region][addr.Name] = addr
	cas.reservedAddrs[addr.Address] = true
	return nil
}

@@ -132,3 +132,15 @@ func (gce *GCECloud) GetRegionAddressByIP(region, ipAddress string) (*compute.Ad
}
return nil, makeGoogleAPINotFoundError(fmt.Sprintf("Address with IP %q was not found in region %q", ipAddress, region))
}

// TODO(yujuhong): retire this function once Network Tiers becomes Beta in GCP.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we open an issue and reference that (rather than by username). I know it's annoying, but it's better to not assign to a person.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

NetworkTierAnnotationStandard = "Standard"
NetworkTierAnnotationPremium = "Premium"

NetworkTierStandard NetworkTier = NetworkTierAnnotationStandard
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is there a reason why can't do directly?

NetworkTierStandard NetworkTier = "Standard"

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I prefer keeping the annotation key/values pure strings (not an internal NetworkTier type) since it's essentially our API.

// GetServiceNetworkTier returns the network tier of GCP load balancer
// which should be assembled, and an error if the specified tier is not
// supported.
func GetServiceNetworkTier(service *v1.Service) (NetworkTier, error) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Golang usually don't add Get prefix.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any suggestion? I am bad with naming and the Get prefix makes the intent of the function clear to me.

@@ -133,3 +133,15 @@ func (gce *GCECloud) DeleteRegionForwardingRule(name, region string) error {

return gce.waitForRegionOp(op, region, mc)
}

// TODO(yujuhong): retire this function once Network Tiers becomes Beta in GCP.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

link to the same issue as above

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

@@ -426,7 +439,7 @@ func (gce *GCECloud) DeleteExternalTargetPoolAndChecks(name, region, clusterID s
// verifyUserRequestedIP checks the user-provided IP to see whether it can be
// used for the LB. It also returns whether the IP is considered owned by the
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you clarify this comment as the function can now return (true, err != nil), seems confusing.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. I changed the function to never return (true, non-nil-err). If the err is non-nil, the boolean value should not be used anyway.

if existingTier == desiredNetTier {
return nil
}
glog.V(2).Infof("%s: Network tiers do not match; existing forwarding rule: %q, desired: %q", logPrefix, existingTier, desiredNetTier)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

probably just combine into one log

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

if existingTier == desiredNetTier {
return nil
}
glog.V(2).Infof("%s: Network tiers do not match; existing address: %q, desired: %q", logPrefix, existingTier, desiredNetTier)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

combine these log lines...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

return isHTTPErrorCode(err, http.StatusForbidden)
}

func handleNetworkTierGetError(err error) (string, error) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this logic not possible to just put in the GetAlphaRegionAddress, ... functions?

this is a super generic function name...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's shared by two files -- gce_addresses.go and gce_forwardingrule.go.
I renamed it to handleAlphaNetworkTierGetError() to make it slightly more explicit, and also added a TODO with a bug number to remove this.

k8s-github-robot pushed a commit that referenced this pull request Aug 30, 2017
Automatic merge from submit-queue

e2e: Add tests for network tiers in GCE

This test depends on #51301, which adds the new feature. Only the `e2e: Add tests for network tiers in GCE` commit is new.
#51301 should pass this new test.
@k8s-github-robot k8s-github-robot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Aug 30, 2017
@k8s-ci-robot k8s-ci-robot added the lgtm "Looks good to me", indicates that a PR is ready to be merged. label Sep 1, 2017
@k8s-github-robot
Copy link

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: bowei, yujuhong
We suggest the following additional approver: erictune

Assign the PR to them by writing /assign @erictune in a comment when ready.

Associated issue: 51483

The full list of commands accepted by this bot can be found here.

Needs approval from an approver in each of these OWNERS Files:

You can indicate your approval by writing /approve in a comment
You can cancel your approval by writing /approve cancel in a comment

@k8s-github-robot k8s-github-robot removed the lgtm "Looks good to me", indicates that a PR is ready to be merged. label Sep 1, 2017
@k8s-github-robot k8s-github-robot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Sep 1, 2017
@yujuhong
Copy link
Contributor Author

yujuhong commented Sep 1, 2017

Rebased and addressed the nits. Re-applying lgtm based on #51301 (comment)
Will probably need to rebase at some point though.

@yujuhong yujuhong added the lgtm "Looks good to me", indicates that a PR is ready to be merged. label Sep 1, 2017
This feature supports specifying what network tier (premium, standard)
to use for the load balancer backing the Service (type=LoadBalancer).
@yujuhong
Copy link
Contributor Author

yujuhong commented Sep 1, 2017

Rebased again and verified that the rebased PR still passed the e2e test.

@k8s-github-robot k8s-github-robot removed the lgtm "Looks good to me", indicates that a PR is ready to be merged. label Sep 1, 2017
@yujuhong yujuhong added the lgtm "Looks good to me", indicates that a PR is ready to be merged. label Sep 1, 2017
@yujuhong
Copy link
Contributor Author

yujuhong commented Sep 1, 2017

Rebased again and verified that the rebased PR still passed the e2e test.

Re-applied the lgtm.

@yujuhong
Copy link
Contributor Author

yujuhong commented Sep 1, 2017

/test pull-kubernetes-kubemark-e2e-gce

kubemark issue has already been fixed by a revert. Re-testing

@yujuhong
Copy link
Contributor Author

yujuhong commented Sep 1, 2017

/test pull-kubernetes-kubemark-e2e-gce

@yujuhong
Copy link
Contributor Author

yujuhong commented Sep 1, 2017

@krzyzacy
Copy link
Member

krzyzacy commented Sep 1, 2017

@spxtr ^^ is this mean something wrong when reporting back (crier)? any idea how to recover?

@spxtr
Copy link
Contributor

spxtr commented Sep 1, 2017

/test pull-kubernetes-kubemark-e2e-gce

@krzyzacy
Copy link
Member

krzyzacy commented Sep 1, 2017

http://prow.k8s.io/?type=presubmit&job=pull-kubernetes-kubemark-e2e-gce

I think the job is just backlogged... the test was from a different trigger earlier and you triggered it again and now it's queueing again

@spxtr
Copy link
Contributor

spxtr commented Sep 1, 2017

Looks like this job is regularly taking 3+ hours to complete, including queue time. Welp.

@yujuhong
Copy link
Contributor Author

yujuhong commented Sep 1, 2017

I think the job is just backlogged... the test was from a different trigger earlier and you triggered it again and now it's queueing again

Thanks for checking. I'll check the queue next time before triggering....

@yujuhong
Copy link
Contributor Author

yujuhong commented Sep 2, 2017

Failed due to some infra flake: https://k8s-gubernator.appspot.com/build/kubernetes-jenkins/pr-logs/pull/51301/pull-kubernetes-kubemark-e2e-gce/50032

/test pull-kubernetes-kubemark-e2e-gce

@fejta-bot
Copy link

/retest
This bot automatically retries jobs that failed/flaked on approved PRs (send feedback to @fejta).

Review the full test history for this PR.

@cblecker
Copy link
Member

cblecker commented Sep 2, 2017

/test pull-kubernetes-kubemark-e2e-gce

@k8s-github-robot
Copy link

/test all [submit-queue is verifying that this PR is safe to merge]

@k8s-github-robot
Copy link

Automatic merge from submit-queue

@k8s-github-robot k8s-github-robot merged commit 6d32783 into kubernetes:master Sep 3, 2017
@k8s-ci-robot
Copy link
Contributor

@yujuhong: The following tests failed, say /retest to rerun them all:

Test name Commit Details Rerun command
pull-kubernetes-bazel 5b129fd link /test pull-kubernetes-bazel
pull-kubernetes-e2e-kops-aws 76945ad link /test pull-kubernetes-e2e-kops-aws

Full PR test history. Your PR dashboard. Please help us cut down on flakes by linking to an open issue when you hit one in your PR.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@yujuhong yujuhong deleted the net-tiers-v0.3 branch September 11, 2017 20:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
approved Indicates a PR has been approved by an approver from all required OWNERS files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. lgtm "Looks good to me", indicates that a PR is ready to be merged. release-note Denotes a PR that will be considered when it comes time to generate release notes. size/L Denotes a PR that changes 100-499 lines, ignoring generated files.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

10 participants