-
Notifications
You must be signed in to change notification settings - Fork 341
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
t176 #3329
base: main
Are you sure you want to change the base?
t176 #3329
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good start
Changed my mind on validate vs verify, updated comment :) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice, it's getting there
cts/cli/regression.daemons.exp
Outdated
@@ -27,13 +27,13 @@ | |||
<shortdesc lang="en">Pacemaker controller options</shortdesc> | |||
<parameters> | |||
<parameter name="dc-version"> | |||
<longdesc lang="en">Includes a hash which identifies the exact revision the code was built from. Used for diagnostic purposes.</longdesc> | |||
<longdesc lang="en">Includes a hash which identifies the exact changeset the code was built from. Used for diagnostic purposes.</longdesc> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This was updated in #3325. I'm not sure how you ended up with just some of the changes from that; maybe try exporting your commits as patches and reapply them to a clean branch.
Seeing the XML output reminds me that I forgot the schema portion of the crm_verify project :/ I'll open a new task for that ... |
Actually, crm_verify XML output only has status and errors, so it fits in the existing schemas. So, all we need to do is update the crm_mon schema for this project once it's ready. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks great.
Add crm_mon regression tests -- you can use one of the crm_verify_invalid*xml files to test invalid syntax and crm_mon.xml to test valid syntax. Test text and XML for each using defaults, and also test --include=verifications for text+valid and --exclude=verifications for XML+invalid
Is there anything left you're unsure about?
Actually we have plenty of text/XML + valid tests, so we just need to add tests for invalid and --include/--exclude |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Getting there! When you're close to happy with it, flatten the code commits and the test output commits for the next review. Thanks!
lib/pacemaker/pcmk_output.c
Outdated
pcmk__output_free(verify_out); | ||
|
||
if (verify_rc == pcmk_rc_ok) { | ||
if (pcmk_is_set(section_opts, pcmk_section_verify)) { | ||
PCMK__OUTPUT_LIST_HEADER(out, false, rc, "Cluster Summary"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The way this macro works is that rc has to be initialized to pcmk_rc_no_output, and the macro will output the header the first time it's called and change rc to pcmk_rc_ok. Later calls will do nothing since the rc is changed. So, all calls for the same header have to use the same rc variable, which is why the header checks are all in the cluster-summary implementations.
This is a little different since we always want to output errors. Probably the easiest approach is to separate the verification itself from the output. We can always do the verification in the cluster-summary implementations, then output the message if the flag is set or there are errors.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To make sure I'm understanding this correctly, do you think the verification (pcmk__verify()
call) should happen in cluster-summary and the output (PCMK__OUTPUT_LIST_HEADER()
and out->list_item()
) should happen in cluster-verify?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was thinking cluster-summary should call pcmk__verify()
and output the header, and cluster-verify would just output the message based on the rc. however at that point we might as well just do everything in cluster-summary and not have a separate message for cluster-verify
lib/pacemaker/pcmk_output.c
Outdated
scheduler = pe_new_working_set(); | ||
scheduler->priv = verify_out; | ||
|
||
verify_rc = pcmk__verify(scheduler, verify_out, scheduler->input); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You don't want a new scheduler object here, because it won't have input set to anything. To avoid output, you can save the initial priv value, reset it as you have here, then set it back after this
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When I use the old scheduler object, there are some different failures:
- Failed (rc=000): crm_resource - Try to move a resource to its existing location
- Failed (rc=064): crm_resource - Move a resource from its existing location
- Failed (rc=108): crm_resource - Move dummy to node1
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Calling pcmk__verify()
shouldn't have any effects on the scheduler object, not sure how that's possible
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
try rebasing on current main and see if that changes anything
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
also ditto for scheduler->priv
, that could be causing output that's changing the tests
lib/pacemaker/pcmk_output.c
Outdated
|
||
pcmk__output_new(&verify_out, "none", NULL, NULL); | ||
verify_rc = pcmk__verify(scheduler, verify_out, scheduler->input); | ||
pcmk__output_free(verify_out); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You also need to set scheduler->priv = verify_out
before calling pcmk__verify()
(and save and restore the original value) because the scheduler code will output messages there too (pcmk__output_cluster_status()
sets scheduler->priv
before calling the cluster-status message)
lib/pacemaker/pcmk_output.c
Outdated
out->info(out, "CIB syntax is valid"); | ||
} | ||
} else { | ||
out->info(out, "CIB syntax has errors (for details, run crm_verify -LV)."); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
info() does nothing for XML, you have to add the XML element and attribute like you defined in the schema
lib/pacemaker/pcmk_output.c
Outdated
scheduler = pe_new_working_set(); | ||
scheduler->priv = verify_out; | ||
|
||
verify_rc = pcmk__verify(scheduler, verify_out, scheduler->input); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
also ditto for scheduler->priv
, that could be causing output that's changing the tests
lib/pacemaker/pcmk_output.c
Outdated
pcmk__output_free(verify_out); | ||
|
||
if (verify_rc == pcmk_rc_ok) { | ||
if (pcmk_is_set(section_opts, pcmk_section_verify)) { | ||
PCMK__OUTPUT_LIST_HEADER(out, false, rc, "Cluster Summary"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was thinking cluster-summary should call pcmk__verify()
and output the header, and cluster-verify would just output the message based on the rc. however at that point we might as well just do everything in cluster-summary and not have a separate message for cluster-verify
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think I see what's happening ...
@@ -18,6 +18,8 @@ | |||
#include <crm/common/xml.h> | |||
#include <crm/pengine/internal.h> | |||
|
|||
#include <pcmki/pcmki_verify.h> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a problem ...
libpe_status can't use anything from libpacemaker, which is higher in the library stack. We could move pcmk__verify()
to libpe_status except that it calls pcmk__schedule_actions()
from libpacemaker. So, we'll have to move the cluster-summary messages from libpe_status (lib/pengine/pe_output.c) to libpacemaker (lib/pacemaker/pcmk_output.c). The only caller of cluster-summary is in libpacemaker anyway, and output messages are not public API, so there's no problem that way.
cluster-summary and other messages use get_node_feature_set()
, so that will have to be exposed (with a pcmk__
prefix)
@@ -450,6 +458,28 @@ cluster_summary(pcmk__output_t *out, va_list args) { | |||
scheduler->localhost, last_written, user, client, origin); | |||
} | |||
|
|||
// Use the existing scheduler, but avoid scheduler output | |||
pcmk__output_new(&verify_out, "none", NULL, NULL); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
check return value for errors
} else { | ||
/* If there are verification errors, always print a statement about that, even if not requested */ | ||
PCMK__OUTPUT_LIST_HEADER(out, false, rc, "Cluster Summary"); | ||
out->list_item(out, NULL, "CIB syntax has errors (for details, run crm_verify -LV)"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
looking at this again, let's omit the crm_verify arguments -- the user could be running against a CIB_file. it's up to the user to figure out what arguments they need.
priv_orig = scheduler->priv; | ||
scheduler->priv = verify_out; | ||
|
||
verify_rc = pcmk__verify(scheduler, verify_out, scheduler->input); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's happening is that pcmk__verify()
calls pcmk__schedule_actions()
, and then crm_simulate calls pcmk__schedule_actions()
again, and it's not happy with being called twice.
One of these two approaches should work:
- Call
pe_reset_working_set()
after runningpcmk__verify()
. That will freescheduler->input
, so you'll have to make a copy of that first and set it back afterward. - Create a new scheduler object and copy the
input
andnow
members.
No description provided.