Bug 1120595

Summary: Synchronization status and refresh should not be available when repo is not synced
Product: Red Hat Satellite Reporter: Sergio Ocón-Cárdenas <soconcar>
Component: WebUIAssignee: Brad Buckingham <bbuckingham>
Status: CLOSED DUPLICATE QA Contact: Katello QA List <katello-qa-list>
Severity: high Docs Contact:
Priority: unspecified    
Version: 6.0.3CC: bbuckingham, bkearney, soconcar
Target Milestone: UnspecifiedKeywords: Triaged
Target Release: Unused   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2014-09-05 12:59:47 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description Sergio Ocón-Cárdenas 2014-07-17 08:57:16 UTC
Description of problem:
If you create a custom product with a custom channel that is not synchronized, you still can request the environment for a sync, that will fail with a warning.

Version-Release number of selected component (if applicable):
6.0.3

How reproducible:
Always

Steps to Reproduce:
1. Create a custom product
2. Create a custom repo without original yum server
3. Synchronize it

Actual results:
Sync starts as fails with a warning

Expected results:
A message and a dialog explaining that there is nothing to synchronize

Additional info:
I would expect a warning dialog explaining that only sync-able repos will be sync when I assign a synchronization plan to a product that is not sync-able

Comment 1 RHEL Program Management 2014-07-17 09:24:09 UTC
Since this issue was entered in Red Hat Bugzilla, the release flag has been
set to ? to ensure that it is properly evaluated for this release.

Comment 3 Brad Buckingham 2014-09-03 21:28:37 UTC
Hi Sergio, can you help to clarify the steps that you were executing to encounter this issue?  Were you using the UI or CLI?

I ran through a few scenarios using the UI; however, I didn't encounter any errors (yet).  It is possible that I am not using the same scenario, but it is also possible that the issue has since been solved.

Below are some steps that I ran through using the UI:

From Content -> Products:

1. create a custom product (named: feedless)
2. create a custom repo (named: feedless)

3. select the newly created repo, observed that 'Sync' button is not available

4. click 'Back to Repository List', click the checkbox next to the repo and click 'Sync Now' button, the following error is displayed:
   
    Repository feedless does not have a feed url.

5. go to Content -> Sync Status and observed that my feedless product and repo are not displayed

Comment 4 Brad Buckingham 2014-09-04 19:16:44 UTC
After poking at the UI a bit more, I did identify one scenario that needs to be fixed.  Going to address it with this BZ; however, Sergio, if your scenario is different than this, please provide the appropriate details with steps to reproduce.  Including screenshots and foreman-debug logs would also be useful. Thanks :)

The UI scenario that I do see that has in issue is the following:

From Content -> Products:

1. create a custom product (named: feedless)
2. create a custom repo (named: feedless)

3. in the product, click the 'Details' tab
4. click 'Sync Now'

At this point, 'Sync Now' becomes 'Syncing...' and remains that way indefinitely.

As a user, I'd expect it to go back to 'Sync Now' after the request is accepted by the server and a notification provided to the user that is consistent with other areas of the UI.   E.g.:

"Successfully started sync for feedless products, you are free to leave this page."

Comment 5 Brad Buckingham 2014-09-04 19:17:34 UTC
Created redmine issue http://projects.theforeman.org/issues/7360 from this bug

Comment 6 Brad Buckingham 2014-09-04 19:46:02 UTC
Proposed fix in Katello PR: 
https://github.com/Katello/katello/pull/4640

Comment 7 Sergio Ocón-Cárdenas 2014-09-05 08:11:50 UTC
I was using the GUI.

My intention:
create a custom report with a puppet module and a rpm that I could send to hosts (as a custom rpm with an application)


Created a Product
Created a Customized Rpm repository
Uploaded a rpm to the repository

In Repositories:
- Sync now is enabled
- Sync plan is enabled

If I press sync I get this message:

Sync started, you can leave this page now

But it fails

Details

PLP0000: Importer indicated a failed response

More Details 

Acción:

Actions::Pulp::Repository::Sync

Input:

{"pulp_id"=>"ACME_Corporation-Customized-customized-rpm",
 "remote_user"=>"admin",
 "locale"=>"en"}

Output:

{"pulp_tasks"=>
  [{"exception"=>nil,
    "task_type"=>"pulp.server.tasks.repository.sync_with_auto_publish",
    "_href"=>"/pulp/api/v2/tasks/add55fa7-d0da-4359-ba74-9fd3c71ece6a/",
    "task_id"=>"add55fa7-d0da-4359-ba74-9fd3c71ece6a",
    "tags"=>
     ["pulp:repository:ACME_Corporation-Customized-customized-rpm",
      "pulp:action:sync"],
    "finish_time"=>"2014-09-05T08:09:33Z",
    "_ns"=>"task_status",
    "start_time"=>"2014-09-05T08:09:33Z",
    "traceback"=>
     "Traceback (most recent call last):\n  File \"/usr/lib/python2.6/site-packages/celery/app/trace.py\", line 240, in trace_task\n    R = retval = fun(*args, **kwargs)\n  File \"/usr/lib/python2.6/site-packages/pulp/server/async/tasks.py\", line 306, in __call__\n    return super(Task, self).__call__(*args, **kwargs)\n  File \"/usr/lib/python2.6/site-packages/celery/app/trace.py\", line 437, in __protected_call__\n    return self.run(*args, **kwargs)\n  File \"/usr/lib/python2.6/site-packages/pulp/server/tasks/repository.py\", line 210, in sync_with_auto_publish\n    sync_result = managers.repo_sync_manager().sync(repo_id, sync_config_override=overrides)\n  File \"/usr/lib/python2.6/site-packages/pulp/server/managers/repo/sync.py\", line 113, in sync\n    raise PulpExecutionException(_('Importer indicated a failed response'))\nPulpExecutionException: Importer indicated a failed response\n",
    "spawned_tasks"=>[],
    "progress_report"=>
     {"yum_importer"=>
       {"content"=>
         {"size_total"=>0,
          "items_left"=>0,
          "items_total"=>0,
          "state"=>"NOT_STARTED",
          "size_left"=>0,
          "details"=>
           {"rpm_total"=>0, "rpm_done"=>0, "drpm_total"=>0, "drpm_done"=>0},
          "error_details"=>[]},
        "comps"=>{"state"=>"NOT_STARTED"},
        "distribution"=>
         {"items_total"=>0,
          "state"=>"NOT_STARTED",
          "error_details"=>[],
          "items_left"=>0},
        "errata"=>{"state"=>"NOT_STARTED"},
        "metadata"=>
         {"state"=>"FAILED",
          "error"=>"Unable to sync a repository that has no feed"}}},
    "queue"=>"reserved_resource_worker-1.cloud.dq",
    "state"=>"error",
    "result"=>nil,
    "error"=>
     {"code"=>"PLP0000",
      "data"=>{},
      "description"=>"Importer indicated a failed response",
      "sub_errors"=>[]},
    "_id"=>{"$oid"=>"54096fbd0ca01e2dc225039d"},
    "id"=>"54096fbdc3beb0071b4c7f34"}],
 "poll_attempts"=>{"total"=>3, "failed"=>3}}

Exception:

Katello::Errors::PulpError: PLP0000: Importer indicated a failed response

Backtrace:

/opt/rh/ruby193/root/usr/share/gems/gems/katello-1.5.0/app/lib/actions/pulp/abstract_async_task.rb:96:in `block in external_task='
/opt/rh/ruby193/root/usr/share/gems/gems/katello-1.5.0/app/lib/actions/pulp/abstract_async_task.rb:94:in `each'
/opt/rh/ruby193/root/usr/share/gems/gems/katello-1.5.0/app/lib/actions/pulp/abstract_async_task.rb:94:in `external_task='
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/action/polling.rb:86:in `poll_external_task_with_rescue'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/action/polling.rb:15:in `run'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/action/cancellable.rb:9:in `run'
/opt/rh/ruby193/root/usr/share/gems/gems/katello-1.5.0/app/lib/actions/pulp/abstract_async_task.rb:57:in `run'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/action.rb:439:in `block (3 levels) in execute_run'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/middleware/stack.rb:26:in `call'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/middleware/stack.rb:26:in `pass'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/middleware.rb:16:in `pass'
/opt/rh/ruby193/root/usr/share/gems/gems/katello-1.5.0/app/lib/actions/middleware/remote_action.rb:25:in `block in run'
/opt/rh/ruby193/root/usr/share/gems/gems/katello-1.5.0/app/lib/actions/middleware/remote_action.rb:51:in `block (2 levels) in as_remote_user'
/opt/rh/ruby193/root/usr/share/gems/gems/katello-1.5.0/app/lib/katello/util/thread_session.rb:85:in `set_pulp_config'
/opt/rh/ruby193/root/usr/share/gems/gems/katello-1.5.0/app/lib/actions/middleware/remote_action.rb:41:in `as_pulp_user'
/opt/rh/ruby193/root/usr/share/gems/gems/katello-1.5.0/app/lib/actions/middleware/remote_action.rb:50:in `block in as_remote_user'
/opt/rh/ruby193/root/usr/share/gems/gems/katello-1.5.0/app/lib/katello/util/thread_session.rb:92:in `set_cp_config'
/opt/rh/ruby193/root/usr/share/gems/gems/katello-1.5.0/app/lib/actions/middleware/remote_action.rb:36:in `as_cp_user'
/opt/rh/ruby193/root/usr/share/gems/gems/katello-1.5.0/app/lib/actions/middleware/remote_action.rb:49:in `as_remote_user'
/opt/rh/ruby193/root/usr/share/gems/gems/katello-1.5.0/app/lib/actions/middleware/remote_action.rb:25:in `run'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/middleware/stack.rb:22:in `call'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/middleware/stack.rb:26:in `pass'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/middleware.rb:16:in `pass'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/action/progress.rb:30:in `with_progress_calculation'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/action/progress.rb:16:in `run'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/middleware/stack.rb:22:in `call'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/middleware/stack.rb:26:in `pass'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/middleware.rb:16:in `pass'
/opt/rh/ruby193/root/usr/share/gems/gems/katello-1.5.0/app/lib/actions/middleware/keep_locale.rb:24:in `block in run'
/opt/rh/ruby193/root/usr/share/gems/gems/katello-1.5.0/app/lib/actions/middleware/keep_locale.rb:35:in `with_locale'
/opt/rh/ruby193/root/usr/share/gems/gems/katello-1.5.0/app/lib/actions/middleware/keep_locale.rb:24:in `run'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/middleware/stack.rb:22:in `call'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/middleware/world.rb:30:in `execute'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/action.rb:438:in `block (2 levels) in execute_run'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/action.rb:437:in `catch'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/action.rb:437:in `block in execute_run'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/action.rb:361:in `call'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/action.rb:361:in `block in with_error_handling'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/action.rb:361:in `catch'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/action.rb:361:in `with_error_handling'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/action.rb:432:in `execute_run'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/action.rb:226:in `execute'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/execution_plan/steps/abstract_flow_step.rb:9:in `block (2 levels) in execute'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/execution_plan/steps/abstract.rb:152:in `call'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/execution_plan/steps/abstract.rb:152:in `with_meta_calculation'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/execution_plan/steps/abstract_flow_step.rb:8:in `block in execute'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/execution_plan/steps/abstract_flow_step.rb:22:in `open_action'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/execution_plan/steps/abstract_flow_step.rb:7:in `execute'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/executors/parallel/worker.rb:20:in `block in on_message'
/opt/rh/ruby193/root/usr/share/gems/gems/algebrick-0.4.0/lib/algebrick.rb:859:in `block in assigns'
/opt/rh/ruby193/root/usr/share/gems/gems/algebrick-0.4.0/lib/algebrick.rb:858:in `tap'
/opt/rh/ruby193/root/usr/share/gems/gems/algebrick-0.4.0/lib/algebrick.rb:858:in `assigns'
/opt/rh/ruby193/root/usr/share/gems/gems/algebrick-0.4.0/lib/algebrick.rb:138:in `match_value'
/opt/rh/ruby193/root/usr/share/gems/gems/algebrick-0.4.0/lib/algebrick.rb:116:in `block in match'
/opt/rh/ruby193/root/usr/share/gems/gems/algebrick-0.4.0/lib/algebrick.rb:115:in `each'
/opt/rh/ruby193/root/usr/share/gems/gems/algebrick-0.4.0/lib/algebrick.rb:115:in `match'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/executors/parallel/worker.rb:17:in `on_message'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/micro_actor.rb:82:in `on_envelope'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/micro_actor.rb:72:in `receive'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/micro_actor.rb:99:in `block (2 levels) in run'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/micro_actor.rb:99:in `loop'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/micro_actor.rb:99:in `block in run'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/micro_actor.rb:99:in `catch'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/micro_actor.rb:99:in `run'
/opt/rh/ruby193/root/usr/share/gems/gems/dynflow-0.7.1/lib/dynflow/micro_actor.rb:13:in `block in initialize'
/opt/rh/ruby193/root/usr/share/gems/gems/logging-1.8.1/lib/logging/diagnostic_context.rb:323:in `call'
/opt/rh/ruby193/root/usr/share/gems/gems/logging-1.8.1/lib/logging/diagnostic_context.rb:323:in `block in create_with_logging_context'



End result:

Sync Status
All dates and times below are relative to this server.
Sync Interval Synced manually, no interval set.
Last Sync Sep 5, 2014 10:07:21 AM
Next Sync Synced manually, no interval set.
Sync State error

Comment 8 Brad Buckingham 2014-09-05 12:41:29 UTC
Sergio, thanks for the additional details.  It sounds like that behavior may be on earlier GA, Beta or MDP builds.

With the latest GA build, I see the behaviors described in #3 and #4, which means (among other things) that if go to a repo that doesn't have a feed/url, the 'Sync Now' button is not available.  

I did submit a fix for the issue that I observed in #4, where attempting to sync a product would not give the user a notification and would leave the 'Sync Now' button indicating 'Syncing...'.

Comment 9 Brad Buckingham 2014-09-05 12:59:47 UTC
Actually, I just came across a couple of bugs.  One that describes a similar behavior to what you saw (bug 1094986) and one that describes the bug that I saw (bug 1128796).

Therefore, I am going to realign my fix to bug 1128796 and close this one as a duplicate of 1094986.

*** This bug has been marked as a duplicate of bug 1094986 ***